Java 中 Redis 怎么利用 HyperLogLog 类型的 PFADD 命令以极低的固定内存基数统计千万级网站独立访客(UV)

秋杰小哥_3428

秋杰小哥_3428

2026-07-30

984人浏览

原创

redis hyperloglog用12kb固定内存即可估算千万级uv,误差仅±0.81%,核心是pfadd批量添加(单次≤1024个稳定标识如user_id)、按天+业务维度建key并设ttl、pfcount多key合并为实时去重并集,不存原始数据,适用于运营看板等近似统计场景。

java 中 redis 怎么利用 hyperloglog 类型的 pfadd 命令以极低的固定内存基数统计千万级网站独立访客(uv)

Java 中用 Redis HyperLogLog 做千万级 UV 统计,核心不是“存数据”,而是“做估算”——12KB 固定内存就能扛住上亿用户去重,误差仅 ±0.81%,关键在 PFADD 的调用逻辑、key 的设计方式和业务标识的选型。

PFADD 要批量加、看返回值、别当成功/失败用

PFADD 支持一次传多个用户 ID,但不是逐个判断,而是整体去重后更新内部寄存器:

  • 单次最多传 1024 个 ID;超了必须拆条,否则截断(Jedis 默认不分片,得自己切)
  • 返回 1 表示「至少有一个新用户被识别」,返回 0 表示「本次所有 ID 都已被该 key 记住」——这不是操作失败,是正常去重反馈
  • 用户标识必须稳定:优先用 user_id 或 device_id,不用 session_id、临时 token 或 IP(易变、不准)
  • 空字符串 ""、数字 123、JSON 字符串都合法,但业务上得能唯一对应一个自然人

Key 必须按天+业务维度建,且设 TTL 防内存堆积

每个 HyperLogLog 固占 12KB,不随数据量增长,但 key 不清理就会一直占内存:

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 推荐格式:uv:page:home:20260721(页面维度)、uv:channel:ios:20260721(渠道维度)
  • 禁止混用:App 和 PC 的 user_id 不能塞进同一个 key,否则跨端同人会被误判为一人
  • PFADD 不自动设过期,首次写入后必须立刻执行 EXPIRE,比如存活 24 小时:jedis.expire("uv:page:home:20260721", 86400)
  • 更稳妥做法:用定时任务清理 7 天前的 key,不依赖 Redis 自动过期(可能延迟或被禁用)

PFCOUNT 查总数,多 key 合并是实时并集,不是相加

查单日 UV 直接 PFCOUNT 单 key;查周 UV 用多 key 合并,结果是去重后的并集:

  • 代码示例:jedis.pfcount("uv:page:home:20260715", "uv:page:home:20260716", ..., "uv:page:home:20260721")
  • 这等价于内存中临时 PFMERGE 再估算,某用户连续 7 天访问也只算 1 次
  • 纯读操作,不改源 key,但高并发下频繁多 key 查询会吃 CPU,报表类任务建议错峰执行
  • 日常监控用单 key,汇总分析才用多 key,避免无谓开销

它不能回溯、不能精确,但特别适合“总量快、合并易”的场景

HyperLogLog 不存原始 ID,所以天生有边界:

  • 无法查「今天 UV 里 iOS 用户有多少」——需要配合 Bitmap 或落库日志做二次筛选
  • 无法知道漏了谁、多了谁——只保证整体误差 ≤0.81%,对运营看板、大促实时大盘完全够用
  • 不能替代 Set 做登录校验、权限判断,也不适用于财务、审计等强一致场景
  • 想验证估算是否合理?可用 DEBUG OBJECT key 看 encoding 类型,但生产环境慎用

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9117

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6282

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

5632

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1004

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

848

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1196

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2409

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19751

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1095

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习