[TOC] #### 1. 前言 --- 用户签到、每日打卡、在线状态,这种数据只有两种状态:签了/没签,在线/不在线 用 Set 存 ? 100 万用户就是 100 万个 key,太浪费了,Bitmap 用一个 bit 就能表示一个用户的状态,100 万用户只要 125KB #### 2. Bitmap 是什么 --- Bitmap 不是一种独立的数据类型,底层就是 String 把一个字符串看成一个 bit 数组,每个 bit 只能是 0 或 1 一个字节 = 8 个 bit,1MB = 800 万个 bit = 800 万个用户的状态,省空间省到离谱 #### 3. 基本操作 --- 用户 1001 在第 8 天签到(bit 从 0 开始,7 代表第 8 天): ```bash setbit sign:user:1001:2026:05 7 1 ``` 查看第 8 天签没签: ```bash getbit sign:user:1001:2026:05 7 # 1=签了,0=没签 ``` 统计这个月签了几天: ```bash bitcount sign:user:1001:2026:05 ``` #### 4. 实战:签到系统 --- ```python def sign_in(user_id, day): key=f"sign:user:{user_id}:2026:05" redis.setbit(key, day-1, 1) def is_signed(user_id, day): key=f"sign:user:{user_id}:2026:05" return redis.getbit(key, day-1) def get_sign_count(user_id): key=f"sign:user:{user_id}:2026:05" return redis.bitcount(key) ``` #### 5. Bitmap vs Set --- 100 万用户签到数据: + Set → 100 万个 key,至少 50MB+ + Bitmap → 1 个 key,125KB 差了 400 倍,但 Bitmap 只能表示 “是/否”,不能存更多信息,需要存用户ID列表的场景,还是得用 Set #### 6. 本文小结 --- 小总结: + Bitmap 底层是 String,每个 bit 代表一个状态 + setbit 设置,getbit 查询,bitcount 统计 + 100 万用户签到只要 125KB + 适合:签到、在线状态、布尔型特征 + 只要 “是/否” 的场景,Bitmap 碾压 Set