Redis SETBIT 记录活跃用户

作者:haobinghui 时间:2019-08-29 浏览:408 次

一个 bit 最大可以存放 2^32-1 = 4294967295 个位,我们使用 0(没登录) 1(登录) 来表示用户是否登录

那么我们使用每个位的 index 对应用户的 uid,如果用户今天登录的,就将此用户 uid 对应的位 index 的值设为 1。

如下图所示:

第一行是一个 bit (比如记录今天用户的登录情况),对应的 index=0 因为用户的 uid 是大于 0 的,所以 bit 的第一位的值设为 0

我们按照一个网站的用户按照 10 亿来算的,2^10 = 120多M 


index

0

1

2

3

4

5

6

.

.

.

.

.

.

4294967295 

isLogin

0

1

0

0

0

1

1










Setbit 的实际应用

场景: 1亿个用户, 每个用户 登陆/做任意操作,记为 今天活跃,否则记为不活跃

每周评出: 有奖活跃用户: 连续7天活动

每月评,等等...

 

思路:

Userid   dt      active

1     2013-07-27   1

1     2013-07-26   1

 

如果是放在表中, 1:表急剧增大,2:要用group ,sum运算,计算较慢


用: 位图法 bit-map

Log0721:  011001...............0

......

log0726 :  011001...............0

Log0727 :  0110000.............1


1: 记录用户登陆:

每天按日期生成一个位图, 用户登陆后,user_id位上的bit值置为1

 

2: 1周的位图  and 计算,

位上为1的,即是连续登陆的用户


redis 127.0.0.1:6379> setbit mon 100000000 0

(integer) 0

redis 127.0.0.1:6379> setbit mon 3 1

(integer) 0

redis 127.0.0.1:6379> setbit mon 5 1

(integer) 0

redis 127.0.0.1:6379> setbit mon 7 1

(integer) 0

redis 127.0.0.1:6379> setbit thur 100000000 0

(integer) 0

redis 127.0.0.1:6379> setbit thur 3 1

(integer) 0

redis 127.0.0.1:6379> setbit thur 5 1

(integer) 0

redis 127.0.0.1:6379> setbit thur 8 1

(integer) 0

redis 127.0.0.1:6379> setbit wen 100000000 0

(integer) 0

redis 127.0.0.1:6379> setbit wen 3 1

(integer) 0

redis 127.0.0.1:6379> setbit wen 4 1

(integer) 0

redis 127.0.0.1:6379> setbit wen 6 1

(integer) 0

redis 127.0.0.1:6379> bitop and  res mon feb wen

(integer) 12500001


如上例,优点:

1: 节约空间, 1亿人每天的登陆情况,1亿bit,1200WByte,10M 的字符就能表示

2: 计算方便

标签: reidis