Redis数据结构之Bitmap

本文最后更新于 2025年5月25日

未完待续

1.概述

  • 由0和1状态表现的二进制位的bit数组(数组里每个元素只能是0或1)该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)。
  • 基于String数据类型的按位的操作。
  • Bitmap支持的最大位数是2³²位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2³²= 4294967296)

2.常见操作

2.1 SETBIT

设置0或1到Bitmap

SETBIT key offset value
  • key
  • offset 偏移位,从0开始计算
  • value 只能是0或1

例:

127.0.0.1:6379> setbit k1 1 1
(integer) 1
127.0.0.1:6379> setbit k1 2 1
(integer) 1
127.0.0.1:6379> setbit k1 3 1
(integer) 1

验证:Bitmap基于String数据类型的

127.0.0.1:6379> type k1
string

2.2 GETBIT

获取0或1,不是1就默认0

127.0.0.1:6379> getbit k1 1
(integer) 1
127.0.0.1:6379> getbit k1 2
(integer) 1
127.0.0.1:6379> getbit k1 3
(integer) 1
127.0.0.1:6379> getbit k1 4
(integer) 0

2.3 STRLEN

不是字符串长度而是Bitmap占据几个字节,按照8位一组扩容,统计有多少组

127.0.0.1:6379> setbit k3 0 1
(integer) 0
127.0.0.1:6379> setbit k3 7 1
(integer) 0
127.0.0.1:6379> strlen k3
(integer) 1
127.0.0.1:6379> setbit k3 8 1
(integer) 0
127.0.0.1:6379> strlen k3
(integer) 2

2.4 BITCOUNT

一个bitmap中从START到END有多少个1,不加START|END统计全部

BITCOUNT KEY [START|END]

例:

127.0.0.1:6379> bitcount k3
(integer) 3

2.5 BITOP

对bitmap进行二进制运算(与AND、或OR、非NOT、异或XOR)保存结果到DESTKEY KEY

BITOP AND|OR|NOT|XOR DESTKEY KEY [KEY ...]

例:

准备数据

127.0.0.1:6379> setbit bin1 0 1
(integer) 0
127.0.0.1:6379> setbit bin1 1 1
(integer) 0
127.0.0.1:6379> setbit bin1 2 0
(integer) 0
127.0.0.1:6379> setbit bin1 3 1
(integer) 0
127.0.0.1:6379> setbit bin2 0 0
(integer) 0
127.0.0.1:6379> setbit bin2 1 1
(integer) 0
127.0.0.1:6379> setbit bin2 2 1
(integer) 0
127.0.0.1:6379> setbit bin2 3 0

测试:BITOP AND

127.0.0.1:6379> BITOP AND bintemp bin1 bin2
(integer) 1

查看写入到bintemp中的结果

127.0.0.1:6379> getbit bintemp 0
(integer) 0
127.0.0.1:6379> getbit bintemp 1
(integer) 1
127.0.0.1:6379> getbit bintemp 2
(integer) 0
127.0.0.1:6379> getbit bintemp 3
(integer) 0

3.总结

命令 作用 时间复杂度
setbit 给指定key的值的第offset赋值val O(1)
getbit 获取指定key的第offset位 O(1)
bitcount 返回指定key中[start,end]中为1的数量 O(n)
bitop 对不同的二进制存储数据进行位运算(AND、OR、NOT、XOR) O(n)

使用场景:

1.统计签到、登录、打卡等,例如:ID为10001的用户2025年5月的第12个工作日未打卡

setbit sign:uid_10001:202505 12 0

"如果文章对您有帮助,可以请作者喝杯咖啡吗?"

微信二维码

微信支付

支付宝二维码

支付宝


Redis数据结构之Bitmap
https://blog.liuzijian.com/post/redis-data-structure-bitmap.html
作者
Liu Zijian
发布于
2024年10月16日
更新于
2025年5月25日
许可协议