Redis Bitmap
redis bitmap简介
redis中的bitmap是一串连续的2进制数字,每一位所在的位置为偏移,在bitmap上可以执行AND,OR,XOR,NOT等位操作。
bitmap中保存每个位置的数据仅使用了一个bit,而对应的数据的存储根据大小在bitmap中相对应offset。
一个简单的例子:日活跃用户
为了统计今日登录的用户数,我们建立了一个bitmap,每一位标识一个用户ID。当某个用户访问我们的网页或执行了某个操作,就在bitmap中把标识此用户的位置为1。在Redis中获取此bitmap的key值是通过用户执行操作的类型和时间戳获得的。之后可以通过各天的bitmap进行位操作来统计相应的数据。
在这里,bitmap在大数据量的情况下,占用大小较为稳定,增长不会随着存储数据量线性增长。也不会只存储一个 2^32-1数字就占满 512G(存在着内存压缩)。
bitmap vs hash
在数据量没有那么大的情况下,使用bitmap可能比使用hashmap还要占用空间。因此,做了如下的实验来验证各个数据存储量的情况下,bitmap与hash占用的空间大小。
|
|
实际测试代码,测试少量数据情况下【100~100000】及大量数据情况下的【100000,10000000】情况下的实际空间大小,并使用gonum/plot绘制出效果图:
|
|
实验结果如下:
在假定两亿用户的情况下,小规模数据测试情况下,可以发现6W左右数据存储的情况下,hash 和 bitmap使用的空间都为400~500KB,而用户小于6W的情况下使用hash稍有优势。而数据规模更大的时候,bitmap的存储优势就发挥了出来。
大规模场景下可以看出hash的空间占用为线性增长,而bitmap在大规模数据存储的情况下空间占用量的增长则稳定的多。
- Author: kunpeng
- Link: https://kunpengdai.github.io/post/2019/redis-bitmap/
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.