redis使用bit作只有两种状况的“状态“统计(如是否在线的用户统计)

1 记录在线用户数(活跃用户)?redis

好比redis中键a的value数据的二进制码是
0110 0110 0001内存

它总共有12位,在redis的位操做中,二进制中的第几位称为offset。get

咱们能够这样将这个数据的第10位设置为1:
setbit a 10 1it

这样,原来的数据就变成了
0110 0110 0101二进制

若是key不存在,也会自动建立。方法

固然,若是某个位还不存在,redis也会自动填充。统计

能够经过getbit获取某个二进制位的值数据

getbit a 10 //获取键a的值上第10位的值(0或1两种状态)查询

这是所谓的位图。di

那么咱们考虑在redis中放一个key,经过这个key直接操做二进制位,redis中单个key的最大值是512M,能够达到40多亿bit,足够不少业务的须要了。咱们以用户id做为offset,该offset的值做为是否活跃的值便可达到咱们的目的。这样只须要一个key就能解决对全部数据的查询问题。假设咱们的id最大值是1亿,那么咱们须要一亿个bit就好了,至关于只须要1亿/(810241024)=11.9M内存。这里你们了解下二进制就能理解。

//用户id123456是活跃用户
setbit a 123456 1
//用户id234567不是活跃用户
setbit a 234567 0

--------实际场景---------

若是须要统计天天用户访问量,以日期为key,用户id为offset,访问了之后设置为1 。

如:setbit 20190506 123456 1  这条命令算做一个用户访问后加1;

使用BITCOUNT 20190506命令来得到key为20190506时一共有多少个offset被设置为1;

优势:占用内存更小,查询方便,能够指定查询某个用户,数据可能略有瑕疵,对于非登录的用户,可能不一样的key映射到同一个id,不然须要维护一个非登录用户的映射,有额外的开销。

缺点:若是用户很是的稀疏,那么占用的内存可能比方法一更大。

相关文章
相关标签/搜索