一.背景
这几天,项目中引入了基于redisson的布隆过滤器,redisson底层使用的redis数据结构为bitmap,
借此机会,留下一篇总结;
二.bitMap的原理
bitmap就是通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态。
一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。
三.bitMap的常用API
1.设置值
setbit key offset value
例如:
setbit online 1001 1
2.获取值,返回
getbit key offset
例如:
getbit online 1006
3.获取位图指定范围为1的个数,start和end指定的是字节的个数,而不是位数组下标
bitcount key [start end]
例如
bitcount online
四.案例bitMap统计用户在线人数
状态值,用户在线用1表示,用户离线用0表示
setbit online userid 状态值
例如
1.设置用户在线状态
setbit online 1001 1,表示设置id为1001的用户在线
setbit online 1002 1,表示设置id为1002的用户在线
setbit online 1003 0,表示设置id为1003的用户离线
2.获取用户在线状态
getbit online 1001 ,表示获取id为1001的用户在线状态
getbit online 1002 ,表示获取id为1002的用户在线状态
3.统计在线用户的人数
bitcount online
五.性能
1.以第四部分的案例为例,如果用户id长度为4,则用户id最多占用的比特位的数量为9999,大约即1250个字节,1KB多一点
2.如果活跃用户在百万级别,使用Redis BitMap很划算。
3.如果活跃用户很少,而用户id都是10位以上的int。那就很浪费内存了,还不如使用set集合,然后求交集就可以了。
参考链接:
http://redisdoc.com/bitmap/index.html
https://blog.csdn.net/u011957758/article/details/74783347
https://www.freesion.com/article/8176271491/