首页/数据/数据库速查/BITFIELD 位域读写(多字段紧凑存储)
Redis 命令96 条

BITFIELD 位域读写(多字段紧凑存储)

在字符串上按任意位宽读写整数:一条命令里可组合多个 GET/SET/INCRBY,用 OVERFLOW 控制溢出策略;适合紧凑计数与协议字段。

数据库速查数据更新于 2026-10-13

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 位设计字段。

易错点

  • 想用 u64:不被允许,无符号最大 63 位,设计时要留余量
  • OVERFLOW 写在操作之后:该次操作仍按默认 WRAP 回绕,结果与预期不符
  • 多个服务对同一键使用不同位域布局:读出错误数值且不报错
  • 用 WRAP 默认策略做累加:超过上限直接回绕到小值,计数完全失真
  • 位宽与业务取值范围不匹配:u8 只能存到 255,稍大就溢出,应提前按峰值设计

数据来源与参考

  • Redis 官方文档: BITFIELD
  • Redis 官方文档: Bitmaps

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌