*Redis SETBIT 命令

SETBIT 设置或清除指定键对应字符串值中某偏移位置的位(bit)。


*语法

SETBIT key offset value

*参数说明

参数 类型 必填 说明
key String Bitmap 键名
offset Integer 位偏移量,从 0 开始,最大 232-1(即 0 ~ 4294967295)
value Integer 位值,只能为 0 或 1

*返回值

  • Integer:返回该偏移位置原来存储的位值(0 或 1)

*时间复杂度

O(1)

*

*示例

*基本用法

> SETBIT user:login:20240101 1001 1
(integer) 0

> SETBIT user:login:20240101 1002 1
(integer) 0

> SETBIT user:login:20240101 1001 0
(integer) 1

> GETBIT user:login:20240101 1001
(integer) 0

*日活统计

> SETBIT dau:2024-01-01 42 1
(integer) 0
> SETBIT dau:2024-01-01 100 1
(integer) 0
> BITCOUNT dau:2024-01-01
(integer) 2

*用户特征标记

> SETBIT user:feature:vip 10001 1
(integer) 0
> SETBIT user:feature:bind_phone 10001 1
(integer) 0
> GETBIT user:feature:vip 10001
(integer) 1

*常见错误

错误 原因 解决
ERR bit offset is not an integer or out of range offset 非整数或超过 232-1 检查 offset 范围,确保在 0 ~ 4294967295 之间
ERR bit is not an integer or out of range value 不是 0 或 1 确保 value 只能是 0 或 1
WRONGTYPE Operation against a key holding the wrong kind of value key 已存在但类型不是 String Bitmap 底层是 String,但其他类型(如 List、Hash)会报错

*最佳实践

  • 日活/留存统计:每个用户 ID 对应一个位偏移,当天登录 SETBIT 为 1,BITCOUNT 统计日活
  • 特征标记:用 Bitmap 存储用户布尔特征(是否会员、是否绑定手机),相比多个 key 内存极省
  • 稀疏 Bitmap 注意:偏移量很大时 Redis 会分配相应内存,极端稀疏的 Bitmap 可评估改用 HyperLogLog
  • 配合 BITCOUNT / BITOP:SETBIT 存储后,常用 BITCOUNT 统计、BITOP 做交集并集运算

*FAQ

Q1: Bitmap 占用多少内存? A: 偏移为 N 时,理论占用约 N/8 字节。Redis 内部使用 String 紧凑存储,但极端稀疏的大偏移 Bitmap 仍可能占用较多内存。

Q2: SETBIT 的 key 类型是什么? A: 底层是 String 类型,SETBIT / GETBIT 是 String 的位操作。TYPE 命令返回 string

Q3: SETBIT 的 offset 最大支持多少? A: 最大 232-1(4294967295)。单个 Bitmap 最大约 512 MB。