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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值