首页/数据/Redis 进阶速查/BITFIELD 位域计数器
数据结构与选型42 条

BITFIELD 位域计数器

在字符串上按任意位宽读写整数字段(u8/i16 等),一次调用可执行多条 GET/INCRBY,适合把多个小计数封装进一个键;溢出行为可选 WRAP/SAT/FAIL。

Redis 进阶速查数据更新于 2026-10-13

位域读写与计数

BITFIELD 把字符串当成位数组,按任意位宽读写整数字段:u8 表示 8 位无符号整数,i16 表示 16 位有符号整数,一次调用可以包含多条读取或递增子命令。它适合把多个小计数器紧凑地放进一个键,例如按天分段的访问量,每天只占 8 位或 16 位。溢出行为可以显式选择:回绕、饱和到边界、或者直接返回失败,默认策略是回绕。

基本信息

语法BITFIELD key GET/SET/INCRBY type offset [OVERFLOW 策略]
位宽无符号 u1 到 u63,有符号 i1 到 i64
偏移数字为位偏移,#n 表示第 n 个该宽度的字段
溢出策略WRAP 回绕(默认)、SAT 饱和、FAIL 失败
返回值与子命令顺序一一对应的数组

典型使用场景

  • 按天或按小时分段的计数器,一个键装下整段时间的数据
  • 配额与频次控制中的轻量计数
  • 布尔位标记打包存储,减少键的数量
  • 设备状态位(开关、告警、模式)的紧凑表达
  • 内存敏感统计场景中替代多个独立的计数键

示例

示例
redis-cli BITFIELD stats INCRBY u8 0 1 INCRBY u8 8 1   # 两个 8 位字段各加一
redis-cli BITFIELD stats GET u8 0                      # 读取第 0 个字段
redis-cli BITFIELD stats OVERFLOW SAT INCRBY u8 0 200   # 饱和模式,不跨越边界
redis-cli BITFIELD stats INCRBY u8 '#1' 1               # #1 表示第 1 个 8 位字段
redis-cli BITFIELD stats GET u16 '#0'                   # 读取首个 16 位字段
redis-cli MEMORY USAGE stats                            # 看紧凑存储的实际收益

参数速读

参数含义注意
type位宽与符号,如 u8、i16位宽决定字段能表达的数值范围
offset位偏移,或以 # 开头的字段序号#n 表示第 n 个该宽度的字段
OVERFLOW溢出时的处理策略默认回绕,计数场景建议显式指定
返回值与子命令一一对应失败的子命令位置返回空值
偏移以位为单位,写错一位就会与相邻字段重叠或错位,读出的是一个多个计数叠加后的值。字段宽度统一时,用 # 前缀的序号写法更不容易出错。
一次调用包含多条子命令可以减少网络往返,但整条命令仍然在单线程上执行,子命令过多照样会拉长阻塞时间,批量操作要控制在合理规模。

易错点

  • 沿用默认的回绕策略做计数,数值溢出后统计结果出现严重偏差
  • 位偏移算错导致字段互相覆盖,读到的是几个计数叠加后的结果
  • 用 8 位字段承载可能超过 255 的计数,溢出后数值翻转
  • 单次 BITFIELD 塞入过多子命令,阻塞时间随子命令数量线性增长

数据来源与参考

  • Redis 官方文档:BITFIELD 命令
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌