Redis怎样防止Hash结构内存溢出_通过配置ziplist参数优化底层编码

张开发
2026/4/21 3:59:29 15 分钟阅读

分享文章

Redis怎样防止Hash结构内存溢出_通过配置ziplist参数优化底层编码
Redis 的 hash 在元素个数 ≤ hash-max-ziplist-entries 且每个字段和值长度 ≤ hash-max-ziplist-value 时使用 ziplist 编码否则升级为 hashtable且不可逆。Hash 什么时候会用 ziplist 编码Redis 的 hash 默认不是一直用哈希表hashtable存的。当满足两个条件时它会退化成更省内存的 ziplist元素个数 ≤ hash-max-ziplist-entries且每个字段和值的长度都 ≤ hash-max-ziplist-value。一旦任一条件被突破整个 hash 就会立即升级为 hashtable —— 这个过程不可逆且会翻倍占用内存。常见错误现象HSET user:1001 name Alice age 30 city Beijing 看似很小但如果某次写入一个长字符串比如 HSET user:1001 bio ...bio 超过 hash-max-ziplist-value整个 key 就立刻转成 hashtable哪怕之前只有 3 个短字段。默认值Redis 7.0hash-max-ziplist-entries 512hash-max-ziplist-value 64如果你存的是 JSON 片段、base64 图片 ID 或带空格的描述文本64 字节很容易超升级后无法自动降级即使你后续删掉长字段内存也不会回收回 ziplist怎么查当前 hash 是什么编码别猜直接用 OBJECT ENCODING 命令确认redis-cli HSET myhash a 1 b 2(integer) 2redis-cli OBJECT ENCODING myhashziplistredis-cli HSET myhash c x.repeat(65)(integer) 1redis-cli OBJECT ENCODING myhashhashtable注意OBJECT ENCODING 返回 ziplist 才说明还在紧凑模式返回 hashtable 就已经“失守”了。线上如果发现大量 hash 占用异常高优先批量检查这个。用 SCAN 配合 OBJECT ENCODING 可以做粗筛但别在大实例上高频执行redis-cli --scan --pattern user:* | xargs -L 1 -I {} redis-cli OBJECT ENCODING {} 这类管道容易丢结果建议用 Lua 脚本原子判断监控层面可采集 INFO memory 中的 used_memory_dataset_perc突然下降可能意味着大量 ziplist 升级因 hashtable 冗余更高调参前必须想清楚的三件事改 hash-max-ziplist-entries 或 hash-max-ziplist-value 不是越大越好本质是在内存、CPU、延迟之间做权衡。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。

更多文章