Bitmap 比 String 省内存是因为直接操作位数组1 bit 表示一个状态100 万用户仅需约 125 KB而 String 存布尔值至少占 50 字节同等数据超 50 MB。Bitmap 为什么比 String 节省内存Redis 的 String 存储一个布尔状态比如“用户是否签到”时哪怕只存 1 或 0实际会占用至少 50 字节包括 SDS 头部、编码元信息、字符串内容本身。而 BITFIELD 或 SETBIT 操作的 Bitmap 是直接操作底层位数组1 个 bit 就能表示一个状态——100 万个用户的状态只需约 125 KB同等数量用 String 存轻松突破 50 MB。关键不是“能不能用”而是“有没有被当成整块内存来管理”Bitmap 本质是 String 类型的特殊用法但 Redis 对它的位操作做了零拷贝优化不解析内容只算偏移量。Bitmap 不是独立类型底层仍是 String所以 GET key 会返回乱码二进制别用它查值位索引从 0 开始SETBIT user:sign:20240601 999999 1 表示第 100 万个用户ID999999当天已签到单个 key 最大支持 232?1 位约 512 MB 内存超了会报错 ERR bit offset is not an integer or out of range用 SETBIT 和 GETBIT 做单点状态存取这是最常用也最容易出错的入口。很多人以为 SETBIT 是“设一个键”其实它是“在某个 key 的某一位上写 0 或 1”。key 不存在会自动创建但位偏移超出当前长度时Redis 会用 0 填充中间空位——这可能导致意外的内存膨胀。避免用大偏移量初始化稀疏状态比如 SETBIT status 999999999 1 会立刻分配 ~125 MB 空间真实场景建议按用户 ID 分片例如 user:sign:20240601:{uid % 1000}把 1000 万用户打散到 1000 个 key防止单 key 过大GETBIT 返回整数 0 或 1不是字符串应用层别直接 JSON.stringify() 它导致 0 变成字符串批量统计用 BITCOUNT但要注意时间复杂度BITCOUNT 在无参数时扫描整个位图O(N) 时间N 是字节数。对一个存了 1 亿用户的 key约 12.5 MB执行一次全量统计可能耗时 5–20 ms在高并发写入时容易成为瓶颈。 ARTi.PiCS ARTi.PiCS是一款由AI驱动的虚拟头像生产器可以生成200多个不同风格的酷炫虚拟头像