memory stats 比 info memory 更能预判淘汰,因其拆解内存来源定位失控模块;关键字段包括 used_memory_dataset、clients.normal、aof.buffer 等,需结合 maxmemory-policy 综合判断淘汰风险。

Redis 7.0 的 MEMORY STATS 能直接暴露淘汰风险,但必须看对字段——只盯 used_memory 和 mem_fragmentation_ratio 会漏掉真正要命的问题。
为什么 MEMORY STATS 比 INFO memory 更能预判淘汰
INFO memory 返回的是聚合值,比如 used_memory 是总估算量,mem_fragmentation_ratio 是 RSS/used_memory 的比值;它看不出内存“长在哪”。而 MEMORY STATS 拆解了每一块的来源,能定位到哪类开销正在失控:
-
clients.normal突然飙升?说明大量客户端积压输出缓冲(如慢订阅、大响应未读) -
aof.buffer持续增长?AOF rewrite 未完成或 fsync 阻塞,可能触发写阻塞 -
replication.backlog接近repl-backlog-size?从节点同步延迟,主节点可能因 backlog 满而丢连接 -
used_memory_dataset占maxmemory超过 85%?即使used_memory还没触顶,淘汰已进入高概率区间
MEMORY STATS 输出里哪些字段和淘汰强相关
Redis 7.0+ 的 MEMORY STATS 返回嵌套数组结构,关键字段需手动解析。真正影响淘汰决策的不是总量,而是“可被释放的那部分”是否已逼近阈值:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
-
used_memory_dataset:你存的所有 key-value + 编码结构(如 listpack、dictEntry)实际占用,这是淘汰策略真正作用的对象 -
used_memory_overhead:固定开销(连接、缓冲、Lua 等),这部分不参与淘汰,但若占比 >30%,说明系统级资源已被挤占,淘汰前就可能 OOM -
db.X.expires(X 是 db 编号):带过期时间的 key 数量。如果该值很大但db.X.avg_ttl很低(比如 -
allocator_active和allocator_allocated:当allocator_active>>allocator_allocated,jemalloc 在 hold 大量页,OS 层内存压力已高,哪怕used_memory没超限,maxmemory-policy也可能提前介入
执行 MEMORY STATS 时容易踩的坑
这个命令本身不耗时,但结果解读极易误判:
- 字段名带点号(如
db.0.keys)不是嵌套 JSON,而是 flat key,Redis 7.0+ 返回的是数组对(["db.0.keys", 12345]),脚本解析时别当成对象遍历 -
peak.allocated是进程启动以来峰值,不是当前值,不能用来判断实时压力 - 普通用户无权限执行,报错
(error) NOPERM this user has no permissions to run the 'memory' command,需确认 ACL 权限含~* +memory - 集群环境下,
MEMORY STATS只返回当前节点数据,不能跨节点聚合;想看全局分布,得逐个节点采集并汇总used_memory_dataset和clients.normal
结合 maxmemory-policy 看淘汰风险的实际信号
光有内存数字不够,得和淘汰策略联动判断:
- 用
volatile-lru但db.X.expires= 0?策略自动退化为noeviction,写操作开始报错(error) OOM command not allowed when used memory > 'maxmemory' - 用
allkeys-lru但used_memory_dataset增速远快于used_memory_overhead?说明业务写入激增,LRU 采样数(maxmemory-samples)若仍为默认 5,淘汰精度下降,冷热 key 辨识失真 -
allocator_fragmentation_ratio> 1.8 且used_memory_dataset/maxmemory> 0.9?此时即使淘汰 key,碎片内存也无法归还 OS,真实可用内存持续萎缩,必须考虑MEMORY PURGE或重启
真正危险的信号,往往藏在 used_memory_dataset 与 clients.normal 的比值变化里——当后者增速超过前者,说明不是数据多了,而是响应堵了,淘汰只是表象,根子在客户端消费能力。










