首先学习一下位图操作的几个命令:
//key对应的bit位第一位设置为1
setbit key 1 1
//查询key值的bit位第一位的值
getbit key 1
//统计key对应的bit位中为1的数量
bitcount key
// 0,0分别为start、end参数,这两个参数为字节索引,不是bit位索引。统计指定范围内bit位为1的数量。
bitcount key 0 0
//第一个0位
bitpos key 0
//第一个1位
bitpos key 1
//从第二个字符算起第一个1位,最后两个参数 1,1分别是字符的位置索引值。
bitpos key 1 1 1
//从第三个字符算起第一个1位,最后两个参数 1,1分别是字符的位置索引值。
bitpos key 1 2 2
位图其实也是普通的key/value,只是位图操作的是value的bit位,普通key/value操作的是byte字符。
从一个例子说明使用位图操作的优势在哪?
公司员工签到,如果一个公司有1万人,签到1年,使用普通的key/value,和使用位图操作所占内存的估算比较。
存10个key/value的签到值前,redis的内存使用情况如下图所示:
执行以下命令
到
10个key/value后,再次查询redis内存使用情况,如下图所示:
10个key/vaue大约占用了500个byte。大约估算以下10000个员工签到一年大约需要内存18Mb。
如果使用位图操作,10000个员工签到1年,key也需要分配内存,计算步骤如下:
1. 计算位图签到的value值,每一个员工大概需要45Byte,一万个员工大概需要0.43Mb。普通员工一年value值大概占用365Byte,一万个员工一年大概占用3.8Mb。
2. 使用位图操作签到的话,每年一个员工只需要一个key,普通的key/value需要365个key,所以使用位图操作只计算key的话,大约只占普通key所需内存的 1/365。(18-3.8)* 1/365 ≈ 0.04Mb。
计算结果,使用位图操作10000个员工签到1年大概需要0.43+0.05 ≈ 0.48Mb。与普通key/value相比,大约占用普通key/value所占用内存的 1/36 。
综上所述,某些场景下使用位图操作,能很大程度上节省不少内存。