redis的bitmap存储结构
redis中存储bitmap使用的是字符串类型存储,也就是在redis内部都是通过SimpleDynamicString 简单动态字符串格式存储的bitmap,内容如下:
这个结构和正常的字符串的存储结构一模一样,注意是一模一样,也就是意味着redis内部在执行setBit、getBit、bitCount这些操作的时候并不区分是真正的字符串还是bitmap,因为对于redis底层来说两者都是字符串存储格式,redis内部没有对两者做区分。
redis bitmap操作命令
设置命令:
除了可以直接通过setbit命令对某个key的offset直接置位之外,我们也可以直接先手动构造一个设置好了位操作的byte[]字符串的数组,然后通过set key byte[]的方式对key进行置位,我们说过redis内部并不区分bitmap和真正的字符串类型
获取命令:
除了可以直接通过getbit命令对某个key的offset直接获取值外,我们也可以通过get key 获取到字符串byte[]数组,然后我们在对byte[]数组进行位解析,这样也可以得到全量的每个偏移的位的具体值了,其原因还是我们说过的redis内部并不区分bitmap和真正的字符串类型
运算命令:
bitop or destkey srckey1 srckey2 srckey3 类似对三个bitmap的key进行或操作后把结果放到了destkey中了,一次与/或/异或操作可以操作多个srckey,这些srckey可以是真正的bitmap对象也可以是字符串,redis不区分,但是不能在一个操作中同时进行与和或,或者 与和异或的操作.
BitMap使用注意事项
setbit key offset 1 设置某个offset的位为0或者1时,offset之前的所有byte[]的内存都要被占用,也就是说比如offset=100000,那么对于redis来说他至少需要申请100000/8=12500长度的byte[]数组才行,相当于只有byte[12500]这个字节真正使用到了,前面的byte[0-12499]都没有真正用到,这些内存就白白浪费掉了,所以使用redis的bitmap一定要注意尽量从小整数的序号开始往上加,否则bitmap结构带来的不是redis内存的节省,而是redis内存的爆炸溢出.
BitMap的最大长度
redis的bitmap能支持的最大offset是2的32次方,也就是42亿,原因是redis的字符串最大只能是512M字节,所以512 * 1024 * 1024 * 8 = 2的32次方.