Redis应用案例——1.位图法统计活跃用户

Redis位图法统计活跃用户

1.题目

若网站有10亿个用户, 现在要统计一周内连续登录的用户

1.1解决:

可以用一个字节8个位表示7个人, 首位不算固定为0, 若某人周一登录则置为1, 没登录则为0

127.0.0.1:6379> set mon 01010100
OK
127.0.0.1:6379> set thu 01100101
OK
127.0.0.1:6379> 
......
127.0.0.1:6379> set sun 00010111
OK
127.0.0.1:6379> 

使用 bitop operation 进行and操作得到

127.0.0.1:6379> bitop and mon mon thu sun
(integer) 8
127.0.0.1:6379> get mon
"00000100"
127.0.0.1:6379> 

表明只有第五位用户连续一周登录

1.2指令

setbit key offset value 修改key中,第offset位的值为value

127.0.0.1:6379> setbit mon 5000 1
(integer) 0

getbit key offset 获取key中,第offset位上的value

127.0.0.1:6379> getbit mon 5000
(integer) 1

bitcount key 统计key中,1的个数

127.0.0.1:6379> bitcount mon
(integer) 4

bitop op destKey key1 key2 …… 其中op可以为AND(于)、OR(或)、NOT(非)、XOR(异或)

命令的主要作用是,给key1、key2…等,这种二进制数据,按位做逻辑运算,结果付到destkey中,没有setbit的位置默认为0

127.0.0.1:6379> setbit mon 10000 1
(integer) 0
127.0.0.1:6379> setbit mon 9999 1
(integer) 0
127.0.0.1:6379> setbit mon 8888 1
(integer) 0
127.0.0.1:6379> bitcount mon
(integer) 3
127.0.0.1:6379> setbit thu 9999 1
(integer) 0
127.0.0.1:6379> setbit thu 7777 1
(integer) 0
127.0.0.1:6379> setbit wen 9999 1
(integer) 0
127.0.0.1:6379> setbit wen 6666 1
(integer) 0
127.0.0.1:6379> bitop and result mon thu wen ##三天连续登陆
(integer) 1251
127.0.0.1:6379> bitcount result ##数量
(integer) 1
127.0.0.1:6379> bitop or resultor mon thu wen ##三天内登陆过的用户
(integer) 1251
127.0.0.1:6379> bitcount resultor ##数量
(integer) 5

1.3空间预估

二进制数据1位为1bit

1千兆字节(gb)=8589934592比特(bit)

理论上1G的内存可以记录85亿多的用户状态,如果userId不连贯,有的userId位数超过85亿位,可以使用一些算法、或者对userId按位分段来解决

2.位图法的优势

简而言之,位图操作是用来操作比特位的,其优点是节省内存空间。为什么可以节省内存空间呢?假如我们需要存储100万个用户的登录状态,使用位图的话最少只需要100万个比特位(比特位1表示登录,比特位0表示未登录)就可以存储了,而如果以字符串的形式存储,比如说以userId为key,是否登录(字符串“1”表示登录,字符串“0”表示未登录)为value进行存储的话,就需要存储100万个字符串了,相比之下使用位图存储占用的空间要小得多,这就是位图存储的优势。

发布了10 篇原创文章 · 获赞 1 · 访问量 811

猜你喜欢

转载自blog.csdn.net/weixin_44852645/article/details/103995195