redis 7.0内存统计更精准,核心是直接读取jemalloc 5.3+真实分配状态,而非估算;used_memory不再虚高,memory stats中allocator_allocated、allocator_active、allocator_fragmentation_ratio和used_memory_dataset成为淘汰决策实时依据。

Redis 7.0 的内存统计更精准,核心不是“换了个新分配器”,而是它终于开始**直接读取 jemalloc 5.3+ 的真实分配状态**,而不是靠估算或间接推导。这意味着 used_memory 不再是“大概值”,MEMORY STATS 里字段也不再是旁证,而是能参与淘汰决策的实时依据。
为什么 used_memory 在 Redis 7.0 前不等于真实可淘汰内存?
旧版 Redis 把 jemalloc 返回的“已申请字节数”直接当 used_memory,但它漏掉了三类关键内存:
- 客户端缓冲区(
client-query-buffer-limit和client-output-buffer-limit控制)——计入used_memory,但不参与 LRU 淘汰 - jemalloc 内部 arena 中已释放但未归还 OS 的页(retain 行为)——这部分抬高
used_memory_rss,却无法被驱逐逻辑感知 - 元数据开销(如 dict、sds header、redisObject 结构体)——旧版无法剥离,导致淘汰时误判“这个 key 占了太多内存”
结果就是:你看到 used_memory 刚过 maxmemory,Redis 开始删 key,但实际物理内存压力可能早已超标,或者删了一堆小 key 后 RSS 几乎没降。
MEMORY STATS 里哪些字段真正反映 jemalloc 当前行为?
Redis 4.0+ 就有 MEMORY STATS,但直到 7.0 才让它和驱逐逻辑联动。重点关注这几个字段:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
-
allocator_allocated:jemalloc 当前认为“已分配给 Redis 使用”的字节数 —— 最接近新版used_memory -
allocator_active:jemalloc 当前向 OS 申请且处于活跃状态的内存 —— 更准地对应used_memory_rss,而非粗略估算 -
allocator_fragmentation_ratio:由allocator_active / allocator_allocated得出 —— 这才是 jemalloc 级别的碎片率,比mem_fragmentation_ratio更底层、更稳定 -
used_memory_dataset(Redis 7.0 新增):从used_memory中剔除 redisObject、dict 元数据等开销,只保留“用户数据本体” —— 淘汰策略真正作用的对象
当 allocator_active 显著大于 allocator_allocated,说明 jemalloc 正在 hold 大量空闲页;此时即使 used_memory_dataset 还有余量,OS 层面可能已触发 OOM killer。
evictIfNeeded() 怎么利用 jemalloc 真实状态做决策?
Redis 7.0 修改了驱逐入口函数 evictIfNeeded() 的触发条件,不再只看 used_memory > maxmemory:
- 引入
used_memory_dataset作为主判断依据,避免因元数据膨胀误触发淘汰 - 当
mem_fragmentation_ratio > 2.0且used_memory_dataset接近上限时,优先执行MEMORY DEFRAG,而不是立刻删 key -
maxmemory-clients不再是独立开关,而是动态加到全局阈值中参与计算:驱逐触发点 =maxmemory + maxmemory-clients,但仅限于客户端缓冲区超限时的“保底限制”
也就是说,Redis 7.0 的淘汰逻辑现在会先问:“是不是碎片太高?是不是客户端缓存占多了?是不是元数据虚高?”——而不是上来就删 key。
真正容易被忽略的是:allocator_active 和 allocator_allocated 的差值,比 mem_fragmentation_ratio 更早暴露 jemalloc 的 retain 倾向;而 used_memory_dataset 的数值,决定了你配置的 maxmemory 实际能留给业务数据多少空间——不是所有字节都平等。










