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