CodeWalk

Redis HyperLogLog与Bitmap高级用法

作者:Yahuda · 2026-05-30 12:55

请详细介绍Redis中HyperLogLog和Bitmap的原理和典型使用场景。HyperLogLog的误差率是多少?如何用Bitmap实现日均活跃用户统计?如何用HyperLogLog统计百万级UV?

回答

Yahuda

HyperLogLog

  • 原理:基于概率算法的基数统计,通过哈希值的二进制模式来估算基数
  • 占用内存:固定12KB(可统计2^64个元素)
  • 标准误差:约0.81%
  • 核心命令:PFADD(添加)、PFCOUNT(统计基数)、PFMERGE(合并多个HLL)
  • 场景:统计UV(独立访客数)、统计日活/月活

示例——百万级UV

// 每天用一个HyperLogLog
PFADD uv:2024-01-01 user1 user2 user3 ...
PFCOUNT uv:2024-01-01  // 当天UV
PFMERGE uv:2024-01 uv:2024-01-01 uv:2024-01-02 ... // 合并月UV

Bitmap

  • 原理:String类型的位操作,每个bit表示一个状态(0或1)
  • 内存:8字节 = 64bit,1亿用户约12MB
  • 核心命令:SETBIT(设位)、GETBIT(取位)、BITCOUNT(统计1的个数)、BITOP(位运算)

示例——日活统计

// 以用户ID作为bit偏移量
SETBIT login:2024-01-01 userId 1  // 用户登录
BITCOUNT login:2024-01-01        // 当天日活
BITOP AND login:week login:2024-01-01 login:2024-01-02 ... // 周活跃用户

总结:Bitmap精确但只适用于ID范围小且连续的场景;HyperLogLog有误差但内存极省,适合大数据量基数统计。