redis位图法统计活跃用户

来源:互联网 发布:百度网盘mac版怎么安装 编辑:程序博客网 时间:2024/06/04 08:16
redis解决实际问题-----位图法统计活跃用户
今天在学习redis时,在网上看到了这样的一个问题:
1、一亿用户,用户有频繁登录的,也有不经常登陆的
2、如何记录用户的登录信息
3、如何来查询活跃用户,【如一周内登录三次】
解决思路:
1、用数据库解决
如果用数据库解决,将用户的登录信息都放在表中,这时,数据库的表会急剧增大
同时,要用到group,sum运算,计算较慢,频繁的访问数据库
2、位图法
设登录的用户为1,没有登录的用户为0
那么一亿的用户的登录状态信息存储容量就不是很大了
如:0100 0001
这样就表示2号和8号用户当天是登录的,其他用户都是没有登录的
至于如何来判断查询用户是否为活跃:
则可以将一周内的位图进行and计算
如,其中的7位用户在周一的登录状态是010 0010
周二的状态是110 0010
周三的状态是111 1100
判断此三天7位用户有哪些是连续登录的,执行and操作就可以了:010 0000
可以看出只有2号用户是三天连续登录的。
实际解决办法:
127.0.0.1:6379> setbit monday 100000000 0
(integer) 0
127.0.0.1:6379> setbit monday 2 1
(integer) 0
127.0.0.1:6379> setbit monday 7 1
(integer) 0
127.0.0.1:6379> setbit monday 5 1
(integer) 0
127.0.0.1:6379> setbit thurday 100000000 0
(integer) 0
127.0.0.1:6379> setbit thurday 5 1
(integer) 0
127.0.0.1:6379> setbit thurday 8 1
(integer) 0
127.0.0.1:6379> setbit thurday 7 1
(integer) 0
127.0.0.1:6379> setbit wednesday 100000000 0
(integer) 0
127.0.0.1:6379> setbit wednesday 2 1
(integer) 0
127.0.0.1:6379> setbit wednesday 5 1
(integer) 0
127.0.0.1:6379> setbit wednesday 8 1
(integer) 0
127.0.0.1:6379> setbit wednesday 7 1
(integer) 0
127.0.0.1:6379> bitop and time monday thurday wednesday
(integer) 12500001
127.0.0.1:6379>

优点:1、节约空间,一亿人每天的登录情况,用一亿bit,约1200WByte,约10M的字符就能表示
2、计算方便