位图命令是什么
Redis 的字符串本质上就是位数组:SETBIT 按位偏移写入 0 或 1,GETBIT 读取某一位,BITCOUNT 统计置位数量,BITOP 对多个键做与或异或运算并把结果写到目标键。用它表示布尔状态极其省空间——一亿用户的签到标记大约只需 12.5MB。
基本信息
| 适用版本 | 位图命令全版本;BITCOUNT 的 BIT 区间参数需 7.0+ |
|---|---|
| 偏移约定 | offset 从 0 开始,写入大偏移会自动扩容 |
| 返回值 | SETBIT 返回该位原值;BITCOUNT 返回 1 的个数 |
| 位运算 | BITOP 支持 AND / OR / XOR / NOT |
| 相关命令 | BITPOS / BITFIELD / STRLEN |
典型使用场景
- 用户签到:按天建键、按用户序号占位,统计当月签到天数
- 活跃度标记:为每个用户记录是否活跃,用 BITCOUNT 直接算日活
- 留存分析:对相邻两天的键做 AND,得到连续活跃人数
- 布尔属性集合:权限或标签的位标记,取值一次到位
- 限免与灰度名单:按用户号定位位偏移,读写都是 O(1)
- 统计口径核对:用 BITPOS 找第一个置位的位置,验证数据起点
示例
示例
SETBIT sign:1001:202610 0 1 # 用户 1001 第 1 天签到
SETBIT sign:1001:202610 3 1 # 第 4 天签到
GETBIT sign:1001:202610 3 # 返回 1
BITCOUNT sign:1001:202610 # 返回 2,本键置位总数
BITCOUNT sign:1001:202610 0 0 # 限定在第 1 个字节内统计
BITOP AND active:both sign:1001:202610 sign:1002:202610 # 两人都签到的位
BITPOS sign:1001:202610 1 # 第一个值为 1 的位偏移
STRLEN sign:1001:202610 # 占用的字节数,用于容量核算命令对照
| 命令 | 作用 | 返回 |
|---|---|---|
| SETBIT key offset value | 写入某一位,value 只能是 0 或 1 | 该位原来的值 |
| GETBIT key offset | 读取某一位 | 0 或 1,键不存在时为 0 |
| BITCOUNT key | 统计置位数 | 整数,可按字节或位区间 |
| BITOP AND dst src1 src2 | 位运算并写入目标键 | 目标键的字节长度 |
| BITPOS key 1 | 找第一个置位位置 | 偏移;未找到时按参数可为 -1 |
offset 与内存成正比:SETBIT k 1000000000 1 会立刻分配约 128MB;稀疏场景先算清楚最大 offset。
位图按最大 offset 预留整段空间:用户编号稀疏或编号基数很大时会浪费内存,此时用 SET 或 Hash 存少量标记更合适。
位图适合编号连续且密集的用户维度:如果用户编号是自增 ID 但增长极快,先做一层内部紧凑序号映射,避免出现几千万量级的 offset 把内存提前撑开。