*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 且不修改值。