# 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交流群
原创网站开发,偏差难以避免。

如若发现错误,诚心感谢反馈。

愿你倾心相念,愿你学有所成。

愿你朝华相顾,愿你前程似锦。