首页/数据/数据库速查/BITOP 位运算与活跃统计
Redis 命令96 条

BITOP 位运算与活跃统计

对多个字符串按位做 AND/OR/XOR/NOT,结果写进目标键;配合 bitmap 做留存/活跃统计:AND 求「都活跃」、OR 求「任一天活跃」。

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

位运算与活跃统计

BITOP 对多个字符串按位做 AND、OR、XOR、NOT,结果写入目标键。配合 SETBIT 构造的 bitmap,可以低成本做活跃与留存统计:AND 求「都活跃」,OR 求「任一天活跃」,XOR 求「只出现在其中一天」。位图按位存储,用用户 ID 当偏移时非常省内存。

基本信息

适用Redis 2.6 及以上字符串命令
语法BITOP <AND|OR|XOR|NOT> destkey key [key ...]
返回值目标键的字节长度
限制NOT 只允许一个源键,长度不一致时短的一侧按 0 补齐

活跃与留存统计

活跃与留存统计
SETBIT day:1 1001 1                # 用户 1001 第一天活跃
SETBIT day:1 1002 1
SETBIT day:2 1002 1                # 用户 1002 第二天也活跃
SETBIT day:2 1003 1
BITOP AND ret:1-2 day:1 day:2      # 两天都活跃:只有 1002
BITOP OR ret:1+2 day:1 day:2       # 任一天活跃
BITOP XOR ret:1x2 day:1 day:2      # 只活跃一天
BITCOUNT ret:1-2                   # 统计人数
BITPOS day:2 1                     # 第一个值为 1 的位偏移

相关命令与口径

命令作用注意
SETBIT key offset 1把某位置 1位 0 是首字节最高位,按字节直觉算会错
BITCOUNT key统计值为 1 的位数可按字节区间统计,注意与位偏移区分
BITPOS key bit找第一个指定值的位常用于定位最小或最大 ID
BITOP AND/OR/XOR多键按位运算并写入目标目标键内容被覆盖
BITOP NOT单键按位取反只接受一个源键

典型使用场景

  • 日活与周活跃统计:按天一个 bitmap,OR 合并出周期活跃
  • 留存计算:AND 求出连续活跃用户集合
  • 签到类业务:一位一用户,内存按最大 ID 增长
  • 黑白名单快速判定:用位图替代大集合
  • 实时统计报表:配合 BITCOUNT 出规模,避免取回全部成员
BITOP 在主线程单次执行,源键达到数 MB 时耗时会上升到毫秒级甚至更高,大 bitmap 的合并统计尽量安排在低峰或放到离线任务。
不要拿正在使用的键当 BITOP 的目标键(destkey):结果覆盖写入不可恢复,务必使用独立的键名。

容量与内存估算

  • 位图占用约等于最大 ID 除以 8 字节,按用户量级预留空间
  • 按天分键既便于合并统计,也便于单独清理历史数据
  • 统计前先用 BITCOUNT 或 STRLEN 估算规模,避免把它误判成小键

统计口径提醒

  • BITCOUNT 支持按字节区间统计,注意与位偏移的口径区别,别混用
  • 按天分键合并出周期数据后,原始键可以保留一段时间便于回溯
  • 位图只能表达有或没有,需要计数时要改用 Hash 或专用结构

易错点

  • 结果键占用生产键:BITOP 直接覆盖目标键内容,命名要独立且可识别
  • 位数与字节数混算:bit 0 是首字节最高位,偏移按位算而非按字节算
  • 稀疏超大 ID 用位图:内存按最大 ID 分配,个别大号用户就能把键撑大
  • 高峰期对几 MB 的 bitmap 做 BITOP:主线程阻塞带来延迟毛刺

数据来源与参考

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

相关工具

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