Redis HyperLogLog
Redis HyperLogLog
HyperLogLog 是 Redis 提供的一种基数估算(Cardinality Estimation)数据结构,专门用于统计去重元素的数量(近似值)。
1. HyperLogLog 特点
✅ 节省内存:无论存储的元素有 10 个 还是 10 亿个,HyperLogLog 只占用 12 KB 内存。
✅ 近似计数:返回去重后的元素个数,但存在小误差(误差率约 0.81%)。
✅ 适用于大规模去重统计,如 UV 统计、IP 统计、关键词计数 等。
2. HyperLogLog 常用命令
(1)PFADD:添加元素
PFADD key element [element ...]
key
:HyperLogLog 的键名。element
:要添加的元素,可以是多个。
📌 示例
PFADD uv_counter "user_1"
PFADD uv_counter "user_2"
PFADD uv_counter "user_3"
作用:将
user_1
、user_2
、user_3
添加到uv_counter
(用户访问计数)。
(2)PFCOUNT:获取去重后计数
PFCOUNT key
key
:HyperLogLog 键名。
📌 示例
PFCOUNT uv_counter # 统计去重后的用户数
返回值:估算的去重计数(近似值)。
(3)PFMERGE:合并多个 HyperLogLog
PFMERGE destKey sourceKey1 sourceKey2 ...
destKey
:合并后存储的键名。sourceKey1, sourceKey2 ...
:要合并的多个 HyperLogLog。
📌 示例
PFMERGE total_uv uv_day1 uv_day2
作用:合并
uv_day1
和uv_day2
的访问数据,存入total_uv
。
3. HyperLogLog 实际应用
(1)统计网站 UV(Unique Visitors)
📌 需求:计算每天网站的唯一访客数(UV),避免重复计数。
📌 方案:每个访客 ID 作为一个元素,存入 HyperLogLog。
PFADD uv:20240319 "user_1"
PFADD uv:20240319 "user_2"
PFADD uv:20240319 "user_1" # 再次访问,仍然只算 1 次
PFCOUNT uv:20240319 # 获取去重后的 UV 计数
优点:相比 Set 存储用户 ID,HyperLogLog 节省大量内存。
(2)统计不同 IP 数量
📌 需求:统计访问网站的不同 IP 数量。
📌 方案:将 IP 地址作为元素,存入 HyperLogLog。
PFADD ip_counter "192.168.1.1"
PFADD ip_counter "192.168.1.2"
PFADD ip_counter "192.168.1.1" # 再次访问,不重复计数
PFCOUNT ip_counter # 获取去重 IP 数量
(3)统计不同关键词搜索次数
📌 需求:统计搜索的不同关键词的数量,而不是具体的关键词。
📌 方案:将用户搜索的关键词存入 HyperLogLog。
PFADD search_keywords "Redis"
PFADD search_keywords "Redis tutorial"
PFADD search_keywords "HyperLogLog"
PFCOUNT search_keywords # 统计去重后的关键词数量
4. HyperLogLog vs. Set
对比项 | HyperLogLog | Set |
---|---|---|
功能 | 近似去重计数 | 精确去重计数 |
内存占用 | 固定 12 KB(不随数据增长) | 随数据量增加 |
误差 | 0.81%(允许误差) | 无误差(精确) |
适用场景 | 统计 UV、IP 数量、大量数据去重 | 存储唯一 ID、去重存储 |
📌 结论:
- 如果要精确去重统计,用
Set
。 - 如果只关心去重计数,且数据量大,用
HyperLogLog
(节省内存)。
5. HyperLogLog 内部原理(简单理解)
HyperLogLog 通过 概率算法 实现去重计数:
- 哈希映射:将元素哈希为二进制数,并寻找最长的前导 0(如
0001101
→ 3)。 - 统计多个桶的最大值,结合 LogLog 公式 估算总数量。
- 通过多次采样和修正,保证误差在 0.81% 以内。
6. 总结
✅ HyperLogLog 是 Redis 中高效的基数估算工具,用于大规模去重计数(如 UV 统计)。
✅ 固定 12 KB 内存,适用于 海量数据去重统计。
✅ 误差率约 0.81%,但比 Set 更节省内存。
✅ 常用命令:
PFADD
(添加元素)PFCOUNT
(获取去重后计数)PFMERGE
(合并多个 HyperLogLog)
💡 适用场景:网站 UV 统计、IP 统计、关键词搜索次数、去重计数等。
参考文献
[1] https://redis.io/docs/latest/develop/data-types/probabilistic/hyperloglogs/