位域读写与计数
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 | 溢出时的处理策略 | 默认回绕,计数场景建议显式指定 |
| 返回值 | 与子命令一一对应 | 失败的子命令位置返回空值 |
偏移以位为单位,写错一位就会与相邻字段重叠或错位,读出的是一个多个计数叠加后的值。字段宽度统一时,用 # 前缀的序号写法更不容易出错。
一次调用包含多条子命令可以减少网络往返,但整条命令仍然在单线程上执行,子命令过多照样会拉长阻塞时间,批量操作要控制在合理规模。