Redis HyperLogLog内存评估_根据基数大小调整HLL精度配置

陌婷大大_7401

陌婷大大_7401

2026-04-24

516人浏览

原创

HyperLogLog内存占用与基数非线性:小基数用稀疏模式(几百字节),超阈值(默认约3000唯一元素)后跃升至12KB稠密模式;精度参数hll-precision需重启生效,影响内存与误差。

redis hyperloglog内存评估_根据基数大小调整hll精度配置

HyperLogLog内存占用和基数的关系不是线性的

Redis 的 HLL 底层用的是稀疏(sparse)→ 稠密(dense)双模式存储,小基数时用稀疏编码(0x01~0xFF前缀+变长整数),内存极省;一旦超过阈值(默认约 3000 个唯一元素),自动转为 12KB 固定大小的稠密结构。这意味着:从 100 到 2999 个不同值,内存可能只占几百字节;但第 3000 个一插入,立刻跳到 12KB —— 这个跃变点必须心里有数。

  • 稀疏模式下,实际内存 ≈ 16 + 8 × 实际非零寄存器数 字节(寄存器最多 2^13 = 8192 个,但稀疏模式只存非零项)
  • 稠密模式固定占用 12500 字节(即 12KB 左右),与实际基数无关
  • 触发转换的阈值由 hll_sparse_max_bytes 配置控制,默认是 3000,但这个值不是“元素个数”,而是稀疏编码估算的内存上限(单位字节)

调整 hll_precision 会影响精度和内存,但 Redis 不支持运行时修改

Redis 启动时通过 --hll-precision N 或配置项 hll-precision 设置精度参数 m(寄存器数量 = 2^m),默认 m=14 → 16384 个寄存器 → 稠密模式固定 12KB。改小 m 能直接减内存,比如设为 12(4096 寄存器),稠密结构降到约 3125 字节;但代价是标准误差从 0.81% 升到 3.2%,且小基数下更易触发稀疏→稠密误判。

  • m=10 → 寄存器 1024 个 → 稠密结构约 780 字节,误差 ~12.8%
  • m=16 → 65536 寄存器 → 稠密结构约 48KB,误差 ~0.2%,极少用
  • 注意:hll-precision 是启动参数,修改后必须重启 Redis 实例,已有 HLL 数据不会重算,新写入才生效
  • 如果只是临时压测或灰度,建议在新实例上验证,别在线上直接改配置重启

PFCOUNT 返回值不准?先确认是否真超了稀疏模式容量

当 PFCOUNT 返回值明显偏低(比如插入 5000 个不同值却只报 2000),大概率是稀疏模式已满、但尚未完成向稠密结构的转换(尤其在老版本 Redis ≤ 3.2 中存在竞态 bug)。这不是精度问题,而是内部状态不一致。

Sentinal Redis
Sentinal Redis

监控Redis服务器健康状况、内存、性能及BullMQ队列。检查队列深度、失败任务,分析慢查询并诊断问题。

下载
  • 用 DEBUG OBJECT key 查看实际编码:返回中含 encoding: hll 且 serializedlength 接近 12500 是稠密;若远小于(如 200),则是稀疏
  • 执行一次 PFADD key ""(空字符串)可强制触发转换,但会轻微扰动结果(空值也算一个元素)
  • 升级到 Redis ≥ 4.0 可规避多数稀疏/稠密切换异常,4.0+ 默认启用更稳定的稀疏编码逻辑

线上评估 HLL 内存不能只看 MEMORY USAGE

MEMORY USAGE 返回的是整个 key 的内存开销,包含 key 名、过期信息、dictEntry 等额外结构,对 HLL 来说往往比纯数据大 2–3 倍。真正要盯的是稠密结构是否被大量创建,以及它们是否长期闲置。

  • 用 SCAN + DEBUG OBJECT 批量检查所有 HLL key 的 serializedlength,统计 > 12000 的占比
  • 如果大量 key 都卡在 3000 左右基数、反复横跳于稀疏/稠密之间,说明业务场景本身基数波动剧烈,不如直接用 m=12 启动,统一走小内存稠密模式
  • 定期 PFADD 大量重复值不会增加内存(HLL 本身去重),但频繁调用仍消耗 CPU;避免在循环里对同一 key 反复 PFADD 千次以上

稀疏模式的边界行为、精度参数的不可热更、以及 MEMORY USAGE 的误导性,这三点最容易在压测或扩容时突然冒出来。

相关文章

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

4849

19

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

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

2023.11.14

4415

11

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

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

2024.04.02

8452

6

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

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

2024.04.07

663

6

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

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

2024.04.07

776

6

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

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

2024.04.07

8702

6

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

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

2024.04.07

1180

6

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

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

2024.04.07

1376

6

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

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

2024.04.07

7458

6

热门下载

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

精品课程

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

共0课时 | 0人学习