飞翔飞翔
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 前言

    • 1.Redis简介
  • 第1章 核心数据类型

    • 1.Redis键(Key)
    • 2.Redis字符串(String)
    • 3.Redis哈希(Hash)
    • 4.Redis列表(List)
    • 5.Redis无序集合(Set)
    • 6.Redis有序集合(Sorted Set)
    • 7.Redis HyperLogLog
    • 8.Redis 发布订阅

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+
上一页
6.Redis有序集合(Sorted Set)
下一页
8.Redis 发布订阅