首页/数据/Redis 进阶速查/字典缩容:装载率过低时回收
内存与管理99 条

字典缩容:装载率过低时回收

键被大量删除后,主字典装载率低于约 10% 时会触发缩容,把哈希表迁移到更小规格释放内存,属于渐进过程。

Redis 进阶速查数据更新于 2026-10-13

什么时候缩容

键被大量删除后,主字典的装载率会下降。装载率低于约 10% 时 Redis 触发缩容,把哈希表迁移到更小规格,释放出的内存以台阶形式回落。缩容与扩容共用同一套渐进式 rehash 机制,所以不会一次性完成,删除后内存往往要过一段时间才降下来。

基本信息

缩容触发装载率低于约 10%
扩容触发装载率约 1.0,后台保存期间放宽到约 5.0
实现机制渐进式 rehash,分批迁移
观测特征内存台阶式回落

典型使用场景

  • 批量清理数据后内存没有立即回落,确认是否属于正常节奏
  • 内存水位长期偏高,评估能否通过清理冷数据回收
  • 排查内存曲线呈锯齿状的成因
  • 压测结束后清空数据,观察内存是否回到基线
  • 容量规划:预估一次批量删除能释放多少

观察回落过程

观察回落过程
redis-cli DBSIZE                    # 删除前后的键总数对比
redis-cli INFO memory | grep -E 'used_memory_human|used_memory_peak_human'
redis-cli INFO memory | grep -E 'mem_fragmentation_ratio'   # 碎片率是否变化
redis-cli MEMORY STATS | grep -E 'overhead|dataset'         # 字典等开销是否下降
redis-cli DBSIZE                    # 确认删除已生效,再隔一段时间看内存
redis-cli --scan --pattern 'demo:prefix:*' | head -5   # 抽样确认键确实已被删除

现象与判断

现象原因怎么判断
删除后内存不降缩容是渐进的,分配器也未必立刻把页还给系统等一段时间再比对,不要立刻定性
内存台阶式下降字典缩容与内存页释放分批发生属正常现象
装载率长期在中位徘徊扩容与缩容在阈值间往返关注是否有反复的批量写入与删除
碎片率偏高释放后页未归还,形成外部碎片可评估 activedefrag 是否适用
used_memory_peak 不降峰值指标记录的是历史最高点不要拿它判断当前是否回收
缩容同样走渐进式 rehash,字典越大过程越久。期间查询性能没有明显变化,但 CPU 会有轻微抬升,属于预期行为。
mem_fragmentation_ratio 是 RSS 与 used_memory 的比值,大于 1 说明 RSS 高于逻辑使用量,可能来自碎片或未归还的页;它本身不等于内存泄漏。
大批量删除与大批量写入交替出现时,字典会反复扩容缩容,内存曲线呈锯齿形。若这种模式长期存在,应考虑调整写入模式而不是只看曲线。

易错点

  • 删除后立刻比对内存就断定没有释放:缩容是渐进过程,结论下得太早
  • 把 used_memory_peak 当当前值看:峰值不回落是设计如此,误读会得出错误结论
  • 把 RSS 高于 used_memory 一律归为泄漏:多数情况是碎片或分配器尚未归还
  • 依赖批量删除回收内存来做容量规划:回收量与时点都不确定,无法作为容量承诺的依据

数据来源与参考

  • Redis 官方文档:字典缩容策略
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌