怎么在Redis中利用HyperLogLog实现海量UV去重统计

胖墨君_6813

胖墨君_6813

2026-04-11

577人浏览

原创

hyperloglog适合uv统计的核心原因是其以12kb固定内存、约0.81%误差率高效估算大规模去重基数,优于set的内存爆炸和bitmap对id范围的强依赖;需按天分key存储、用稳定标识、禁用复用与删除,并配合expire管理生命周期。

怎么在redis中利用hyperloglog实现海量uv去重统计

HyperLogLog 适合 UV 统计的核心原因

Redis 的 HLL 不是精确计数器,而是概率型数据结构,用 12KB 固定内存估算集合基数,误差率约 0.81%。对 UV 这类“只关心“有没有来过”,不关心“来了几次”且量级常达千万/亿”的场景,它比 SET(存所有 ID 内存爆炸)或 Bitmap(需要预设用户 ID 范围)更实用。

PFADD 和 PFCOUNT 的正确调用姿势

UV 统计本质是「按天/按渠道聚合去重」,不是单次插入就完事。必须注意:同一个用户在同一天多次访问,只应 PFADD 一次;不同天要分 key 存储,否则无法回溯历史。

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

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

下载
  • 每天生成独立 key,例如:uv:20240520、uv:20240521
  • 用户标识建议用稳定字段,如登录态 user_id 或设备指纹 device_id,避免用会变的 session_id
  • 写入时直接传入字符串,无需 base64 或 hash 预处理:PFADD uv:20240520 "u1001"
  • 读取当天 UV:PFCOUNT uv:20240520;合并多天(如最近 7 天):PFMERGE uv:week uv:20240514 uv:20240515 ... uv:20240520,再 PFCOUNT uv:week

常见踩坑点:精度、内存、误用场景

HLL 不支持删除元素,也不支持获取具体成员列表——它天生就是为“只增不删+只问总数”设计的。一旦误用,问题会隐蔽且难排查。

  • 把 HLL 当 SET 用:比如想查“哪些用户今天来了”,这是做不到的,PFCOUNT 只返回数字
  • key 复用错误:用同一个 key 累加多日数据,会导致后续无法拆分,且 PFCOUNT 结果是累计值而非单日值
  • 低估误差影响:当真实 UV 小于 100 时,HLL 误差可能达 ±10;此时不如直接用 SET + SCARD
  • 内存看似小,但 key 数量多时仍需留意:每个 HLL key 占 12KB,10 万个日粒度 key 就占 1.2GB 内存

和 Bitmap 方案对比时的关键决策点

如果用户 ID 是连续整数且范围可控(比如 1~1 亿),Bitmap(用 SETBIT)能实现 0 误差、更低内存(1 亿 bit ≈ 12MB)。但现实业务中,ID 往往是字符串、UUID 或稀疏整数,这时 HLL 是更稳妥的选择。

  • 选 HLL:ID 类型杂、无全局唯一整数编号、需要快速上线、能接受 ~0.8% 误差
  • 选 Bitmap:ID 可映射为紧凑整数、有离线 ID 映射服务、对误差零容忍、UV 量级稳定在亿以内
  • 别选 SET:UV 过百万后,内存和 SCARD 延迟都会明显上升,Redis 官方明确不推荐用于超大集合去重
实际部署时,最易被忽略的是 key 的生命周期管理——没有定期 EXPIRE 或定时清理过期 key,久而久之冷数据堆积,内存只增不减。记得给每个 uv:YYYYMMDD key 设置 EXPIRE,比如保留 90 天:EXPIRE uv:20240520 7776000。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

redis

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4469

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3995

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7372

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

643

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

756

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

7202

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1160

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1076

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6318

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习