讲师中心 微信公众号
AI工具推荐 视频效率加速

Redis Hash在大数据量下如何防止内存溢出?

小辰姑娘_1454

小辰姑娘_1454

发布时间:2026-08-01 09:47:07

|

452人浏览过

|

来源于php中文网

原创

Hash在字段数超hash-max-ziplist-entries(默认512)或任一value超hash-max-ziplist-value(默认64字节)时,立即不可逆升级为hashtable,且不会因后续删减而降级。

redis hash在大数据量下如何防止内存溢出?

Hash 什么时候会从 ziplist 升级成 hashtable?

Redis 的 HSET 操作看似轻量,但一旦某个 field 的 value 长度超过 hash-max-ziplist-value(默认 64 字节),或总 field 数超过 hash-max-ziplist-entries(默认 512),整个 key 就立刻从内存友好的 ziplist 编码切换为开销更大的 hashtable —— 这个过程不可逆,且升级后即使删掉长字段,也不会自动降级回 ziplist。

常见误判:以为“只写一次长字段,之后都写短字段就没事”,其实升级已发生,后续所有操作都在 hashtable 上运行,内存占用翻倍甚至更高。

  • 用 OBJECT ENCODING your_hash_key 确认当前编码,返回 "ziplist" 才安全
  • 别依赖 redis-cli --bigkeys:它只按总大小排序,无法识别“刚升级的中等 size hashtable”
  • 线上批量检查建议用 Lua 脚本,避免 SCAN + 多次网络往返丢结果

怎么调 hash-max-ziplist-value 才不踩坑?

把 hash-max-ziplist-value 从 64 改成 128 或 256,对存邮箱、手机号、短标签类数据友好;但若业务里混入 JSON 片段、base64 图片 ID、带空格的描述文本,单个 field 就可能超限,触发一次性升级,卡住主线程。

关键不是“设多大”,而是“你能否保证所有写入该 hash 的 value 都稳定 ≤ 该阈值”。如果不能,不如直接接受 hashtable,再通过其他方式控内存。

  • 改之前先用 redis-cli --scan --pattern "your:hash:pattern" | xargs -L 1 -I {} redis-cli HLEN {} 统计实际 field 数分布
  • 用 redis-cli HGETALL your_hash_key | xargs -n2 | awk '{print length($2)}' | sort -nr | head -1 查当前最大 value 长度
  • 若发现已有部分 key 的 value 接近 64 字节,说明阈值已临界,盲目调高只会掩盖问题

Hash 大了真不能拆?

当一个 user profile hash 存了上百个字段,或订单详情 hash 带几十个嵌套字段时,靠调参已无意义。此时 ziplist 和 hashtable 都扛不住 —— 不是编码问题,是单 key 数据模型本身不合理。

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

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

下载

拆分不是为了“绕过阈值”,而是让每个子 hash 可控、可预估、可独立淘汰。

  • 按业务维度切:比如 user:1001:profile(基础信息)、user:1001:settings(偏好)、user:1001:stats(统计)
  • 按时间切:日志类 hash 拆成 log:20260713、log:20260714,配合 TTL 自动清理
  • 避免“伪拆分”:如用 HSET user:1001 field_1 value1 field_2 value2 ... 写满 1000 个字段,仍是一个 hash,仍会升级

监控和兜底必须做哪几件事?

靠人工巡检来不及。真正能防住溢出的是自动化信号+快速响应路径。

INFO memory 中的 used_memory_dataset_perc 突然下降(比如从 95% → 80%),往往意味着大量 hash 刚升级成 hashtable,冗余暴涨;而 mem_fragmentation_ratio > 1.5 时,说明内存碎片严重,即使总用量不高,也可能因分配失败触发 OOM。

  • 在 Prometheus 中配置告警:当 redis_memory_used_bytes / redis_maxmemory_bytes > 0.85 且持续 5 分钟,触发预警
  • 定期跑脚本扫描:对命中 user:*|order:*|session:* pattern 的 key,执行 OBJECT ENCODING + HLEN + MEMORY USAGE 三连查
  • 淘汰策略别选 noeviction:它会让写请求直接报 (error) OOM command not allowed when used memory,业务瞬间雪崩

最常被忽略的点:ziplist 升级是“静默事件”,没有日志、不报错、不影响命令执行,但内存曲线已经拐弯。得靠编码检查+usage 监控双验证,才能提前掐住这个漏点。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

相关专题

更多
大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

5136

2023.06.21

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

1249

2025.12.08

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

243

2026.01.05

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

486

2026.01.05

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

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

4489

2023.11.02

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

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

4035

2023.11.14

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

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

7452

2024.04.02

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

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

643

2024.04.07

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

0

2026.10.16

热门下载

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

精品课程

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn