# Redis HyperLogLog
概念
HyperLogLog 是一种概率型数据结构,用于基数估算(统计唯一元素数量)。它通过哈希算法和概率统计原理,可以用极小的内存(最大12KB)估算超过 10^9 个元素的基数,误差率仅约 0.81%。
# 作用
高效统计海量数据中不重复元素的数量。
以极低内存消耗完成近似去重计算。
支持分布式数据集的合并统计。
# 特性
固定内存占用:无论统计元素数量多少,最大只占用12KB内存。
可容忍误差率:标准误差率0.81%,实际误差可能更低。
不可查询元素:只能统计总数,不能查询具体包含哪些元素。
支持分布式合并:可通过
PFMERGE
命令合并多个HyperLogLog的数据。
# 场景
网站 UV 统计:统计每日独立访客(根据 IP/UserID 去重)。
大型日志分析:快速估算不同事件类型的独立触发次数。
分布式系统统计:合并多台服务器计算的独立用户量。
实时数据流监:控高频写入场景下的近似去重统计。
# 示例
# 1.创建HyperLogLog并添加数据
以统计网站的访问人数为例。显然,同一用户多次访问也只统计一次:
# 添加上午访问的用户(用户ID:1001-1005)
127.0.0.1:6379> PFADD uv:2025-01-01 1001 1002 1003 1004 1005
(integer) 1
# 添加下午访问的用户(用户ID:1003-1008,其中 1003 重复)
127.0.0.1:6379> PFADD uv:2025-01-01 1003 1004 1005 1006 1007 1008
(integer) 1
# 添加晚上访问的用户(用户ID:1001,1002,1006,均重复)
127.0.0.1:6379> PFADD uv:2025-01-01 1001 1002 1006
(integer) 1
# 2.统计近似数
# 统计全天独立访客量
127.0.0.1:6379> PFCOUNT uv:2025-01-01
(integer) 8 # 实际真实值应为 8(1001-1008)
# 3.数据合并
# (扩展)合并多天的统计
127.0.0.1:6379> PFADD uv:2025-01-02 1008 1009 1010 # 统计1月2日的数据
(integer) 1
127.0.0.1:6379> PFMERGE uv:twoDays uv:2025-01-01 uv:2025-01-02 # 合并两天的数据
OK
127.0.0.1:6379> PFCOUNT uv:twoDays # 计算出两天的人数为10
(integer) 10
# 命令集
在 Redis 客户端(如 redis-cli )可以通过help @hyperloglog
命令查找所有与HyperLogLog相关的命令,效果如下:
127.0.0.1:6379> help @hyperloglog
PFADD key element [element ...]
summary: Adds the specified elements to the specified HyperLogLog.
since: 2.8.9
PFCOUNT key [key ...]
summary: Return the approximated cardinality of the set(s) observed by the HyperLogLog at key(s).
since: 2.8.9
PFMERGE destkey sourcekey [sourcekey ...]
summary: Merge N different HyperLogLogs into a single one.
since: 2.8.9
以下是 Redis-x64-3.0.504 版本的HyperLogLog命令集:
命令 | 说明 | 版本 |
---|---|---|
PFADD key element [element ...] | 将指定元素添加到指定的HyperLogLog中 | 2.8.9+ |
PFCOUNT key [key ...] | 返回HyperLogLog观察到的集合的近似基数 | 2.8.9+ |
PFMERGE destkey sourcekey [sourcekey ...] | 将多个不同的HyperLogLog合并为一个 | 2.8.9+ |

微信公众号

QQ交流群
原创网站开发,偏差难以避免。
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。