Redis 中 Bitmap 详解
Bitmap 是什么
Bitmap
即位图,就是通过一个 bit
位来表示某个元素对应的值或者状态,其中的 key
就是对应元素本身。我们知道 8
个 bit
可以组成一个 Byte
,所以 bitmap
本身会极大的节省储存空间。
Redis从 2.2.0
版本开始新增了 setbit
,getbit
,bitcount
等几个 bitmap
相关命令。虽然是新命令,但是并没有新增新的数据类型,因为 setbit
等命令只不过是在 set
上的扩展。
Bitmap 的优势和限制
优势
- 基于最小的单位bit进行存储,所以非常省空间。
- 设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的。
- 二进制数据的存储,进行相关计算的时候非常快。
- 方便扩容
限制
- redis中bit映射被限制在512MB之内,所以最大是2^32位。建议每个key的位数都控制下,因为读取时候时间复杂度O(n),越大的串读的时间花销越多。
setbit 命令介绍
指令 SETBIT key offset value
设置或者清空 key
的 value
key
用户自定义的 key
offset
偏移量value
bit值,只能为 0
或 1
原理介绍
set test a
这个很好理解,把 key
是 test
的值设置为 a
其中 a
的 Ascii
值是 97
,97
的二进制是 1100001
[ PHP代码: echo decbin(ord(‘a’)); ]
譬如 b
的 ascii
值是 98
,转成二进制是 1100010
。
从左往右数(索引从 0
开始),第 6
位和第 7
位不一致。因此只要 a
的二进制值的第 6
位改成 1
,第 7
位改成 0
就变成了 b
setbit test 6 1
setbit test 7 0
get test
然后就可以看到变成了 b
bitmap
类型,它也是从string
类型扩展出来的结构,所以它的命令也可以操作string
。
getbit key offset 获取某个偏移量的值
bitcount key [start end], 统计出bit值为1的数量
这里的 start
和 end
指的是字节(不是位)
以上内容为整合各博客文章而来
redis 命令 setbit、bitcount、getbit、bitop
第十章:Redis中bitmap的妙用
一看就懂系列之 详解redis的bitmap在亿级项目中的应用
【redis缓存】Bitmap类型实现用户签到
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: