位运算与活跃统计
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 或专用结构