首页/数据/Redis 进阶速查/删除键后内存不立刻下降的原因
内存与管理99 条

删除键后内存不立刻下降的原因

内存不立即回落常见三因:分配器保留空闲页不归还系统、异步释放(UNLINK/lazyfree)滞后、碎片与缩容渐进;都属于机制内行为。

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

删除键后内存为什么不立刻降

删除键之后内存不立刻回落是常见现象,原因主要有三类:分配器保留空闲页以备复用而不归还操作系统、异步释放(UNLINK 或 lazyfree 系列)在后台线程慢慢回收、碎片导致的空间需要重新利用。判断要看趋势,而不是某一个瞬间的数值。

基本信息

分配器行为空闲页保留在进程内,供后续分配复用
异步释放UNLINK 与 lazyfree 开关把释放交给后台线程
碎片因素碎片率高时内存回落更慢
观测口径used_memory 与 used_memory_rss 两条曲线一起看
加速手段MEMORY PURGE 请求归还空闲页(jemalloc 有效)

典型使用场景

  • 批量删除后评估:确认回落节奏是否符合机制预期
  • 内存告警处理:区分是真泄漏还是分配器保留
  • 碎片治理:碎片率高时回落慢,考虑整理或滚动重启
  • 容量规划:按常驻内存判断实例真实占用
  • 故障复盘:核对删除操作与内存曲线的时间关系
  • 压测验证:删除后持续观察趋势,避免被瞬时值误导

观测与动作

观测与动作
redis-cli INFO memory | grep -E 'used_memory:|used_memory_rss|mem_fragmentation_ratio'  # 三条曲线一起看
redis-cli MEMORY DOCTOR                     # 体检结论与建议
redis-cli MEMORY PURGE                      # 请求归还空闲页(jemalloc)
redis-cli UNLINK big:key                    # 异步删除大键,键空间立刻摘除
redis-cli CONFIG GET lazyfree-lazy-user-del # 让 DEL 也走异步释放
redis-cli MEMORY STATS                      # 看分配器与保留相关的细节

现象与机制

现象原因处理
used_memory 降、rss 不降分配器保留空闲页可尝试 MEMORY PURGE
两条曲线都降但明显延迟异步释放进行中观察趋势即可,无需干预
碎片率长期偏高分配模式或大键导致整理或调整数据形态
内存持续上涨不回落泄漏或数据真实增长按 Key 分布逐步排查
分配器保留空闲页是性能取舍而不是缺陷:把内存页还给系统意味着下次分配要重新申请,成本体现在延迟上。
长期不回落并且伴随缓慢上涨才是危险信号:前者是机制,后者可能指向真实的泄漏或数据增长。

易错点

  • 删除后内存没有立即下降就反复删除或重启,浪费操作也影响业务
  • 只看逻辑内存不看常驻内存,容器场景下误判真实水位
  • 把异步释放当同步,容量评估用落后于实际的数值做决策
  • 长期不回落也不排查,错过真正的泄漏或数据增长问题

数据来源与参考

  • Redis 官方文档:内存回收机制
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌