首页/数据/数据库速查/位图命令(SETBIT / GETBIT / BITCOUNT / BITOP)
Redis 命令96 条

位图命令(SETBIT / GETBIT / BITCOUNT / BITOP)

字符串即位数组:按 bit 存布尔状态,1 亿用户签到只需 12.5MB;BITCOUNT 统计置位数、BITOP 做多键位运算(AND/OR/XOR)。

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

位图命令是什么

Redis 的字符串本质上就是位数组:SETBIT 按位偏移写入 0 或 1,GETBIT 读取某一位,BITCOUNT 统计置位数量,BITOP 对多个键做与或异或运算并把结果写到目标键。用它表示布尔状态极其省空间——一亿用户的签到标记大约只需 12.5MB。

基本信息

适用版本位图命令全版本;BITCOUNT 的 BIT 区间参数需 7.0+
偏移约定offset 从 0 开始,写入大偏移会自动扩容
返回值SETBIT 返回该位原值;BITCOUNT 返回 1 的个数
位运算BITOP 支持 AND / OR / XOR / NOT
相关命令BITPOS / BITFIELD / STRLEN

典型使用场景

  • 用户签到:按天建键、按用户序号占位,统计当月签到天数
  • 活跃度标记:为每个用户记录是否活跃,用 BITCOUNT 直接算日活
  • 留存分析:对相邻两天的键做 AND,得到连续活跃人数
  • 布尔属性集合:权限或标签的位标记,取值一次到位
  • 限免与灰度名单:按用户号定位位偏移,读写都是 O(1)
  • 统计口径核对:用 BITPOS 找第一个置位的位置,验证数据起点

示例

示例
SETBIT sign:1001:202610 0 1        # 用户 1001 第 1 天签到
SETBIT sign:1001:202610 3 1        # 第 4 天签到
GETBIT sign:1001:202610 3          # 返回 1
BITCOUNT sign:1001:202610          # 返回 2,本键置位总数
BITCOUNT sign:1001:202610 0 0      # 限定在第 1 个字节内统计
BITOP AND active:both sign:1001:202610 sign:1002:202610   # 两人都签到的位
BITPOS sign:1001:202610 1          # 第一个值为 1 的位偏移
STRLEN sign:1001:202610            # 占用的字节数,用于容量核算

命令对照

命令作用返回
SETBIT key offset value写入某一位,value 只能是 0 或 1该位原来的值
GETBIT key offset读取某一位0 或 1,键不存在时为 0
BITCOUNT key统计置位数整数,可按字节或位区间
BITOP AND dst src1 src2位运算并写入目标键目标键的字节长度
BITPOS key 1找第一个置位位置偏移;未找到时按参数可为 -1
offset 与内存成正比:SETBIT k 1000000000 1 会立刻分配约 128MB;稀疏场景先算清楚最大 offset。
位图按最大 offset 预留整段空间:用户编号稀疏或编号基数很大时会浪费内存,此时用 SET 或 Hash 存少量标记更合适。
位图适合编号连续且密集的用户维度:如果用户编号是自增 ID 但增长极快,先做一层内部紧凑序号映射,避免出现几千万量级的 offset 把内存提前撑开。

易错点

  • 按用户自增 ID 直接做位偏移,新注册用户把位图撑大,内存无声暴涨
  • 误以为 BITCOUNT 能按任意区间统计,实际参数是字节或位区间,需换算
  • 用 BITOP 处理很大的键,运算在主线程完成,耗时随键大小线性增长
  • 对 String 类型之外的键调用位命令,直接返回 WRONGTYPE 错误
  • 签到键没有过期时间,按天建键却从不清理,长期累积占用大量内存

数据来源与参考

  • Redis 官方文档: SETBIT
  • Redis 官方文档: BITCOUNT
  • Redis 官方文档: BITOP

相关工具

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