BITOP AND 多日留存结果为0主因是用户ID未映射为非负整数偏移量导致位图索引错乱且destkey存在时会被覆盖需先DEL再操作。BITOP AND 计算多日留存时为什么结果总是 0因为 BITOP 的目标 key 如果已存在会直接覆盖——但更常见的是你把「活跃用户 ID」直接当成了 bitmap 的 bit 位索引而没做去重或归一化映射。Redis bitmap 的每个 bit 对应一个**非负整数偏移量**不是用户 ID 本身。比如用户 ID 是 10086你得把它转成 10086 这个 offset可行但如果 ID 是字符串 u_abc 或超大数字如 9223372036854775808就完全无法存入。必须确保所有参与 BITOP AND 的 key其 bit 位都代表同一组用户空间例如统一用用户注册时分配的自增 uid 作为 offset如果原始数据是字符串 ID得先通过布隆过滤器、分段哈希或预建 user_id → offset 映射表来转换不能现场算BITOP AND destkey srckey1 srckey2 ... 中destkey 若已有值会被清空重写若想累加结果得先 DEL destkey每天一个 bitmap七日留存该用 BITOP 还是 BITCOUNT 客户端交集取决于量级和实时性要求。BITOP 是服务端原子操作快且省带宽但有硬限制BITOP 最多支持 16 个 source key且所有 key 的最大 bit 偏移量必须在 2^32 范围内约 512MB 内存。如果你的日活百万、留存周期拉到 30 天bitmap 可能撑到几百 MBBITOP 执行时会阻塞主线程几毫秒到几十毫秒高并发下容易抖动。七日留存7 个 key完全适合 BITOP AND实测万级 QPS 下延迟稳定在 0.1ms 内超过 16 天或 key 数超限得拆成两轮 BITOP如先算前 8 天交集到 temp1再算后 8 天到 temp2最后 BITOP AND result temp1 temp2若需支持任意 N 日动态留存如“过去 15 天中至少活跃 5 天的用户”BITOP 不适用得改用 BITCOUNT 分别取各日基数再在客户端用集合求交/并/条件统计BITOP AND 后调用 BITCOUNT结果比预期小很多大概率是 bitmap 稀疏导致——你只设置了少量 bit比如只标记了当天活跃的 10 万个用户但 bitmap 实际长度由最大 offset 决定。如果某天最高 offset 是 9999999那这个 key 占用近 1.25MB但其中 99% 的 bit 都是 0。而 BITCOUNT 统计的是整个范围内所有 1 的个数不是“有效用户数”。它没错只是你误以为 bitmap 是稀疏压缩结构其实 Redis bitmap 是纯数组。 AI Code Reviewer AI自动审核代码