Setbit
场景: 1亿个用户, 每个用户 登陆/做任意操作 ,记为今天活跃,否则记为不活跃
用法
周一:1001 0001 1001 0101 1011 0101
周二:1101 0001 1011 0101 1101 0111
周三:1011 0001 1001 0111 1011 0111
1登录用户在位上设置为1,没有登录的用户在位上设置为0
2每一位标识一个用户ID,如1001 0001代表有3个用户登录
3使用and交集,结果是1的用户说明这3天使连续登录的
周一:1001 0001 1001 0101 1011 0101
and
周二:1101 0001 1011 0101 1101 0111
and
周三:1011 0001 1001 0111 1011 0111
= :1001 0001 1001 0101 1001 0101

以上说明,= :1001 0001 1001 0101 1001 0101位上为1的用户都是连续3天都有登录的用户。

redis中的实现

--设置 周一 1001 0001 
127.0.0.1:6379> setbit one 7 0
(integer) 0
127.0.0.1:6379> setbit one 0 1
(integer) 0
127.0.0.1:6379> setbit one 3 1
(integer) 0
127.0.0.1:6379> setbit one 7 1

--设置 周二 1101 0001 
127.0.0.1:6379> setbit two 7 0
(integer) 0
127.0.0.1:6379> setbit two 0 1
(integer) 0
127.0.0.1:6379> setbit two 1 1
(integer) 0
127.0.0.1:6379> setbit two 3 1
(integer) 0
127.0.0.1:6379> setbit two 7 1
--设置 周三 1011 0001

127.0.0.1:6379> setbit third 7 0
(integer) 0
127.0.0.1:6379> setbit third 0 1
(integer) 0
127.0.0.1:6379> setbit third 2 1
(integer) 0
127.0.0.1:6379> setbit third 3 1
(integer) 0
127.0.0.1:6379> setbit third 7 1
(integer) 0

统计3天的连续登录用户案例

127.0.0.1:6379> bitop and res one two third
(integer) 1
127.0.0.1:6379> getbit res 0
(integer) 1
127.0.0.1:6379> getbit res 1
(integer) 0
127.0.0.1:6379> getbit res 2
(integer) 0
127.0.0.1:6379> getbit res 3
(integer) 1
127.0.0.1:6379> getbit res 4
(integer) 0
127.0.0.1:6379> getbit res 5
(integer) 0
127.0.0.1:6379> getbit res 6
(integer) 0
127.0.0.1:6379> getbit res 7
(integer) 1

结果是1001 0001 ,说明在0位,3位,7位的用户这3天都有登录

posted on 2017-06-16 09:46  2637282556  阅读(339)  评论(0编辑  收藏  举报