BITFIELD 是什么
BITFIELD 把字符串当位数组,按任意位宽读写整数:一条命令里可以组合多个 GET、SET、INCRBY 操作,返回各操作的执行结果数组。它有三种溢出策略——WRAP 回绕、SAT 饱和、FAIL 报错,通过 OVERFLOW 子命令控制,且只作用于其后的操作。适合把多个小字段紧凑地放进一个键,例如计数字段与状态位。
基本信息
| 适用版本 | Redis 3.2+ |
|---|---|
| 类型 | u1..u63 无符号、i1..i64 有符号 |
| 偏移写法 | 数字表示位数;#n 表示第 n 个该宽度字段(n × 位宽) |
| 溢出策略 | OVERFLOW WRAP(默认回绕)/ SAT(饱和)/ FAIL(报错) |
| 返回值 | 各操作结果组成的数组;SET 返回该位置的旧值 |
| 底层结构 | String,编码随长度变化(用 OBJECT ENCODING 查看) |
典型使用场景
- 紧凑计数:多个小计数器共用一条键,省内存
- 状态位图:用 u1 存开关状态,多个标记共用一个键
- 协议字段模拟:按位宽拆解二进制报文做校验
- 限额控制:配合 OVERFLOW SAT 实现不越界的累加
- 与 BITCOUNT / BITPOS 配合做统计与定位
读写与溢出
读写与溢出
# 一条命令组合多个操作:SET 后 INCRBY 再 GET
BITFIELD counters SET u8 0 200 INCRBY u8 0 10 GET u8 0
# 依次返回:旧值 0、自增后 210、当前值 210
BITFIELD flags SET u1 0 1 GET u1 0
# #n 表示第 n 个该宽度的字段位置(#3 即 3×8 位)
BITFIELD counters GET u8 '#3'
# 饱和自增:到上限后不再增长,不越界回绕
BITFIELD acct OVERFLOW SAT INCRBY u8 0 100 INCRBY u8 0 100参数读法
| 要素 | 说明 | 注意 |
|---|---|---|
| u / i | 无符号 / 有符号位宽 | 无符号最大 u63,u64 不允许 |
| 偏移 | 位数,或 #n 表示第 n 个字段 | #n 的实际偏移是 n × 位宽 |
| OVERFLOW | 作用于其后所有操作 | 写在操作之后不生效 |
| WRAP / SAT / FAIL | 回绕 / 饱和 / 报错 | 计数场景通常用 SAT |
| 返回值 | 按操作顺序返回数组 | SET 返回旧值,可用于对比 |
位域布局(哪个字段占第几位、位宽多少)必须由业务自己固化成文档:一旦有服务按不同布局解读同一个键,就会读出完全错误的值,这类问题排查起来非常耗时。
OVERFLOW 的位置敏感:它只影响出现在它后面的操作,写在前面或写在后面结果可能完全不同;另外无符号位宽最大支持 63 位,不要按 64 位设计字段。