Redis Bitmap 位图:签到、活跃统计、布隆场景
一、Bitmap 核心原理Bitmap 本质不是独立数据结构底层是String 字符串把字符串的每一个 bit 位单独操作一个 key 可存储千万级二进制标记。1 bit 0/11 字节 8bit1000 万用户仅需约 1.2MB 内存极致省空间核心命令setbit、getbit、bitcount、bitop、bitpos二、核心命令详解SETBIT key offset value 指定偏移位设置 0/1offset 从 0 开始# 用户ID100 今日签到第100位标记1 setbit sign:20260720 100 1GETBIT key offset 查询某一位状态0 未签到1 已签到getbit sign:20260720 100BITCOUNT key [start end] 统计位图中值为 1 的 bit 总数快速算出当日活跃人数# 统计今日总签到人数 bitcount sign:20260720BITOP op destkey key1 key2... 位运算 AND/OR/XOR/NOT做多日活跃交集 / 并集# 7.19 和7.20两天都签到的用户交集 bitop and sign:two_day sign:20260719 sign:20260720 bitcount sign:two_day三、经典业务场景实战场景 1用户每日签到系统设计规则keysign:{日期}offset 用户唯一 ID用户签到setbit sign:20260720 uid 1查询是否签到getbit sign:20260720 uid统计当日签到总人数bitcount sign:20260720连续签到计算多日 bitmap 做 AND 运算统计连续在位数量场景 2平台日活 DAU 统计每日生成一张位图登录用户对应 bit 置 1周活7 天 bitmap OR 合并bitcount 得到一周活跃用户总数月活同理内存开销远低于 Set 存储用户 ID场景 3简易布隆过滤器小规模去重多 Bitmap 组合多个哈希函数映射不同 bit 位插入全部置 1查询全部为 1 则大概率存在。缺点存在误判不支持删除海量数据推荐专业布隆过滤器插件 RedisBloom四、优缺点优点内存极小、读写速度 O (1)、支持批量位运算缺点offset 过大时初始化字符串会耗时不适合 ID 离散超大场景五、Python 极简实战代码import redis r redis.Redis(decode_responsesTrue) # 用户签到 r.setbit(sign:20260720, 10086, 1) # 查询签到状态 print(r.getbit(sign:20260720, 10086)) # 统计今日签到人数 print(r.bitcount(sign:20260720))