01-Redis 特殊数据类型之 BitMap

BitMap

简介

在开发中,可能会遇到这种情况:如需要记录用户一年的打卡情况,打卡了是1,没有打卡是0,如果使用普通的 key/value 存储,则要记录 365 条记录,如果用户量很大,需要的空间也会很大,所以 Redis 提供了 Bitmap 位图这中数据结构, Bitmap 就是通过操作二进制位来进行记录,即为 0 和 1;如果要记录 365 天的打卡情况,使用 Bitmap 表示的形式大概如下:0101000111000111………………………,这样有什么好处呢?当然就是节约内存了,365 天相当于 365 bit,又 1 字节 = 8 bit, 所以相当于使用 46 个字节即可。

BitMap 就是通过一个 bit 位来表示某个元素对应的值或者状态, 其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现。Redis 从 2.2 版本之后新增了 setbit, getbit, bitcount 等几个 bitmap 相关命令。

常用指令

1、setbit 设置操作

语法:SETBIT key offset value : 设置 key 的第 offset 位为 value(1 或 0)。

使用 bitmap 来记录上述事例中一周的打卡记录如下所示:

周一:1,周二:0,周三:0,周四:1,周五:1,周六:0,周天:0 (1 为打卡,0 为不打卡)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
127.0.0.1:6379> setbit sign 0 1
0
127.0.0.1:6379> setbit sign 1 0
0
127.0.0.1:6379> setbit sign 2 0
0
127.0.0.1:6379> setbit sign 3 1
0
127.0.0.1:6379> setbit sign 4 1
0
127.0.0.1:6379> setbit sign 5 0
0
127.0.0.1:6379> setbit sign 6 0
0

2、getbit 获取操作

语法 GETBIT key offset 获取 offset 设置的值,未设置过默认返回 0。

1
2
3
4
127.0.0.1:6379> getbit sign 3 # 查看周四是否打卡
1
127.0.0.1:6379> getbit sign 6 # 查看周七是否打卡
0

3、bitcount 统计操作

语法:bitcount key [start, end] 统计 key 上位为 1 的个数。

1
2
127.0.0.1:6379> bitcount sign  # 统计这周打卡的记录,可以看到只有3天是打卡的状态
3

01-Redis 特殊数据类型之 BitMap
https://flepeng.github.io/041-Redis-41-核心概念-01-Redis-特殊数据类型之-BitMap/
作者
Lepeng
发布于
2021年1月1日
许可协议