Redis之Bitmaps

Bitmaps本身不是一种数据结构,实际上它就是字符串 ,但是它可以对字符串的位进行操作。

Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。

可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。

常用命令:

设置值
setbit key offset value

获取值
gitbit key offset

获取Bitmaps指定范围值为1的个数(不指定范围默认获取所有)
bitcount key [start] [end]
start/end代表索引字节,即从第start个字节开始,到第end个字节结束


Bitmaps间的运算
bitop op destkey key [key....]
op可以是and/or/not/xor
bitop是一个复合操作, 它可以做多个Bitmaps的and(交集)、or(并集)、not(非)、xor(异或) 操作并将结果保存在destkey中。
示例:(取unique:users:2016-04-03和unique:users:2016-04-03的交集,放在unique:users:and:2016-04-04_03中)
bitop and unique:users:and:2016-04-04_03 unique:users:2016-04-03 unique:users:2016-04-03


计算Bitmaps中第一个值为targetBit的偏移量
bitpos key targetBit [start] [end]

应用场景

假设网站有1亿用户,每天独立访问的用户有5千万,如果每天用集合类型和Bitmaps分别存储活跃用户可以得到下表。


很明显, 这种情况下使用Bitmaps能节省很多的内存空间, 尤其是随着时间推移节省的内存还是非常可观的,见下表。


但Bitmaps并不是万金油,假如该网站每天的独立访问用户很少,例如只有10万(大量的僵尸用户) ,那么两者的对比如下表所示,很显然,这时候使用Bitmaps就不太合适了,因为基本上大部分位都是0。

原文地址:https://www.cnblogs.com/MacoLee/p/13999950.html