Redis HyperLogLog与Bitmap高级用法
请详细介绍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有误差但内存极省,适合大数据量基数统计。