Redis 中 Bitmap 详解

Bitmap 是什么

Bitmap 即位图,就是通过一个 bit 位来表示某个元素对应的值或者状态,其中的 key 就是对应元素本身。我们知道 8bit 可以组成一个 Byte,所以 bitmap 本身会极大的节省储存空间。

Redis 中 Bitmap 详解

Redis从 2.2.0 版本开始新增了 setbit,getbit,bitcount等几个 bitmap 相关命令。虽然是新命令,但是并没有新增新的数据类型,因为 setbit 等命令只不过是在 set 上的扩展。

Bitmap 的优势和限制

优势

  1. 基于最小的单位bit进行存储,所以非常省空间。
  2. 设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的。
  3. 二进制数据的存储,进行相关计算的时候非常快。
  4. 方便扩容

限制

  • redis中bit映射被限制在512MB之内,所以最大是2^32位。建议每个key的位数都控制下,因为读取时候时间复杂度O(n),越大的串读的时间花销越多。

setbit 命令介绍

指令 SETBIT key offset value
设置或者清空 keyvalue
key 用户自定义的 key
offset 偏移量
value bit值,只能为 01

原理介绍

set test a

这个很好理解,把 keytest 的值设置为 a
其中 aAscii值是 9797 的二进制是 1100001 [ PHP代码: echo decbin(ord(‘a’)); ]
譬如 bascii 值是 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的数量
这里的 startend 指的是字节(不是位)

以上内容为整合各博客文章而来

redis 命令 setbit、bitcount、getbit、bitop
第十章:Redis中bitmap的妙用
一看就懂系列之 详解redis的bitmap在亿级项目中的应用
【redis缓存】Bitmap类型实现用户签到

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!