*Redis BITFIELD 命令
BITFIELD 对字符串值执行多个位级别的操作(GET/SET/INCRBY),支持有符号和无符号整数类型,是操作位图的高级命令。
*语法
BITFIELD key [GET type offset | [OVERFLOW WRAP | SAT | FAIL] SET type offset value | INCRBY type offset increment] [GET ... | SET ... | INCRBY ...] ...
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 键名 |
| GET type offset | — | 否 | 获取指定偏移的整数值。type: u/i + 位数,如 u8, i16 |
| SET type offset value | — | 否 | 设置指定偏移的整数值 |
| INCRBY type offset increment | — | 否 | 对指定偏移的整数做原子增加 |
| OVERFLOW WRAP / SAT / FAIL | — | 否 | 溢出处理方式:WRAP(回绕,默认)、SAT(饱和)、FAIL(失败) |
*返回值
- Array:每个子命令的返回值
- GET:对应的整数值
- SET:旧值
- INCRBY:增加后的新值
- OVERFLOW FAIL 时溢出:返回 nil
*时间复杂度
O(N),N 为访问的子命令数量
*示例
*基本 GET/SET
> BITFIELD mykey SET u8 0 255 GET u8 0
1) (integer) 0
2) (integer) 255
*原子递增计数器
> BITFIELD counter INCRBY u16 0 1 OVERFLOW SAT
1) (integer) 1
> BITFIELD counter INCRBY u16 0 1
1) (integer) 2
*多子命令组合
> BITFIELD mykey SET u8 0 100 SET u8 8 200 GET u8 0 GET u8 8
1) (integer) 0
2) (integer) 0
3) (integer) 100
4) (integer) 200
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR Invalid bitfield type | type 格式错误 | 使用 uN 或 iN,N 为 1~64 |
| ERR bit offset is not an integer | offset 非整数 | 确保 offset 是整数 |
*最佳实践
- 位图原子操作的利器:一个 BITFIELD 命令可原子执行多个位操作
- 适合实现多个小型计数器存储在单个 key 中
- u8/u16/u32/u64 用于无符号计数器,i8/i16/i32/i64 用于有符号
- INCRBY + OVERFLOW SAT 适合实现范围受限的计数器
- 批量操作用 BITFIELD 比多次 SETBIT/GETBIT 效率更高
*FAQ
Q1: BITFIELD 和 BITOP 有什么区别? A: BITFIELD 操作单个 key 的位域(field),可读写带类型的整数;BITOP 对多个 key 做按位运算(AND/OR/XOR/NOT)。
Q2: 偏移量是按位还是按字节? A: 按位。offset 0 表示第 1 位(最左边/最高位),offset 7 是第 1 字节的最低位。
Q3: OVERFLOW 的三种模式有什么区别? A: WRAP:超出范围后回绕(如 u8 的 255+1=0);SAT:饱和(255+1=255);FAIL:溢出时返回 nil 且不修改值。