Redis Hash扩容机制如何影响生产环境性能?

秋雪小哥_8837

秋雪小哥_8837

2026-07-16

145人浏览

原创

redis hash在field数超512或任一value长度超64字节时,由ziplist不可逆切换为hashtable;随后当负载因子≥1(或强制阈值>5)触发渐进式rehash,内存峰值可达原占用2.5倍。

redis hash扩容机制如何影响生产环境性能?

Hash 扩容本身不阻塞主线程,但会显著增加内存占用和 CPU 开销,尤其在 big hash 场景下容易引发延迟毛刺甚至 OOM。

hash 什么时候从 ziplist 切换到 hashtable

Redis 不是“按需扩容”,而是先触发编码转换,再走 dict 的 rehash 流程。这个切换点直接决定后续性能走向:

  • 默认条件:所有 field 和 value 长度 ≤64 字节,且总数量 ≤512 —— 满足则用 ziplist;任一不满足,立刻转为 hashtable
  • 配置项 hash-max-ziplist-entries 和 hash-max-ziplist-value 可调,但修改后只对新建 hash 生效,已有 big hash 不会回退
  • 一旦转成 hashtable,就不可逆 —— 即使后续删到只剩 10 个 field,底层仍是 dict 结构
  • ziplist 查找是 O(n),但内存紧凑;hashtable 平均 O(1),但每个 entry 多出指针、bucket 数组等开销

hashtable 扩容触发的两个阈值很关键

不是“数据一多就扩”,而是由两个硬性条件控制,生产环境常因忽略后者踩坑:

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

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

下载
  • 常规扩容:当 ht[0].used / ht[0].size ≥ 1 时触发,目标 size = ht[0].used * 2
  • 强制扩容:即使 dict_can_resize = 0(比如运维禁用了自动 resize),只要负载因子 > dict_force_resize_ratio(默认为 5),仍会扩 —— 这是防爆的最后一道闸
  • 扩容后立即启用渐进式 rehash,但 rehashidx 从 -1 变为 0,意味着迁移开始;此时每次 HGET/HSET 都会顺带搬一个 bucket(可能含多个节点)
  • 注意:ht[1] 分配内存时就占用了新空间,旧表 ht[0] 还没释放 —— 内存峰值 ≈ 原占用 × 2.5 倍

big hash 导致 rehash 时间拉长、CPU 毛刺明显

单个 hash 存几十万 field 时,rehash 不再“平滑”,实际表现接近半阻塞:

  • 每个 bucket 迁移耗时取决于链长;若某个 bucket 聚集了上千个 key(哈希冲突高),一次操作可能卡住几毫秒
  • 客户端观察到的现象:HGETALL 响应时间从 0.2ms 突增至 8–12ms,且抖动剧烈;INFO stats 中 instantaneous_ops_per_sec 瞬间跌落
  • Redis 日志里不会报错,但 redis-cli --stat 可看到 rehashing 字段持续非零,且 used_memory_human 快速上涨
  • 监控重点不是 “是否在 rehash”,而是 mem_fragmentation_ratio > 1.5 + rehashing > 0 同时出现 —— 表明内存压力与迁移正在叠加

线上避免 Hash 扩容冲击的实操建议

别等它自己扩,得从设计和配置上掐住源头:

  • 写入前预估规模:单个 hash 的 field 数超 1000 就该警惕;超 5000 基本要拆分,比如按时间分片 user:1001:profile:2026Q2
  • 禁用自动 resize 仅治标,真正有效的是限制单 hash 容量 —— 用 HEXISTS + HLEN 在业务层做守门员,超阈值主动拒绝或告警
  • 不要迷信 hash-max-ziplist-entries 1000:设太高会让 ziplist 查找变慢,反而放大 CPU 使用率;保持默认 512 更稳妥
  • 紧急情况下可手动干预:执行 DEBUG REHASHING 查看进度,但无法暂停;真卡死只能 failover 或临时扩容机器扛住内存峰值

最易被忽略的一点:hash 编码切换和 dict rehash 是两套机制,前者影响内存布局,后者影响运行时性能,但日志里都只显示 “rehashing”,得靠 OBJECT ENCODING 和 INFO memory 组合判断真实瓶颈在哪。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

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

相关专题

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

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

2023.11.02

4309

19

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

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

2023.11.14

3795

11

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

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

2024.04.02

6892

6

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

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

2024.04.07

623

6

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

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

2024.04.07

736

6

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

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

2024.04.07

6522

6

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

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

2024.04.07

1140

6

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

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

2024.04.07

1016

6

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

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

2024.04.07

5818

6

热门下载

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

精品课程

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

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习