当前位置: 首页 > news >正文

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_1user_2user_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_day1uv_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

对比项HyperLogLogSet
功能近似去重计数精确去重计数
内存占用固定 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/

相关文章:

  • 希尔伯特变换
  • http header参数的key包含下划线时遇到的一个问题
  • 1. 初识golang微服务-gRPC
  • Vite+微前端Qiankun-状态管理
  • 【GL008】C++ 入门基础(2)之 多态案例
  • centos【rockylinux】安装【supervisor】的注意事项【完整版】
  • Android开发中的Native 调试
  • Go语言的基础类型
  • STM32和PN532 寻卡实验
  • Springboot项目打包成war包
  • 西门子PLC
  • Freeze-Omni:冻结 LLM,实现语音对话
  • 半导体过程控制篇6 设计质量控制SPC
  • ​第十一届传感云和边缘计算系统国际会议
  • python中测试数据管理整理
  • Spring Cloud之负载均衡之LoadBalance
  • 汇川EASY系列之以太网通讯(MODBUS_TCP做主站)
  • 【工具变量】人口老龄化对经济增长影响数据集(2005-2023年)
  • Python列表1
  • 3.19学习总结
  • 言短意长|新能源领军者密集捐赠母校
  • 日趋活跃!2024年我国数据生产总量同比增长25%
  • 深圳宝安区一宗涉宅用地中止出让,起始总价86.27亿元
  • 今年我国电影票房破250亿领跑全球,“电影+”带动文旅消费热潮
  • 中国贸促会:有近50%的外贸企业表示将减少对美业务
  • 【社论】用生态环境法典守护生态文明