精确诊断内存
MEMORY USAGE 给出单个键的真实内存占用,包含数据本身与对象开销;MEMORY STATS 给出全局的内存分布,例如数据集大小与历史峰值;MEMORY DOCTOR 输出一句人话诊断。它们是排查大 key 与做容量核算的正确工具——用 STRLEN 或 HLEN 估算只能得到业务数据长度,完全没有算上哈希表、字典与对象本身的开销。
基本信息
| MEMORY USAGE key | 单键内存占用,可用 SAMPLES 控制采样深度 |
|---|---|
| SAMPLES 0 | 全量精确统计,大对象上会明显变慢 |
| MEMORY STATS | 全局内存分布视图,用于容量规划 |
| MEMORY DOCTOR | 一句话诊断建议 |
| MEMORY PURGE | 尝试让分配器归还内存,效果通常有限 |
典型使用场景
- 给业务定义单个键的内存预算
- 内存告警时确认具体是哪个键的占用异常
- 核对容量估算与真实占用之间的差距
- 清理大 key 前后对比实际节省了多少内存
- 评估结构改造能省下多少空间
常用子命令
常用子命令
MEMORY USAGE user:1001 # 单键字节数(默认抽样估算)
MEMORY USAGE huge:zset SAMPLES 0 # 全量精确,大对象上很慢
MEMORY STATS # 全局分布:dataset.bytes、peak.allocated 等
MEMORY DOCTOR # 一句话诊断
MEMORY PURGE # 尝试归还碎片(jemalloc)
INFO memory | grep -E "used_memory_human|mem_fragmentation_ratio"命令与适用场景
| 命令 | 返回内容 | 适用场景 |
|---|---|---|
| MEMORY USAGE | 单键字节数 | 判断某个键是否属于大 key |
| SAMPLES 参数 | 采样深度 | 0 表示全量精确,代价是变慢 |
| MEMORY STATS | 聚合视图 | 容量规划与趋势观察 |
| MEMORY DOCTOR | 文字建议 | 快速定位排查方向 |
| MEMORY PURGE | 尝试归还碎片 | 效果受分配器行为影响 |
| INFO memory | 整体水位与碎片率 | 监控大盘使用 |
给业务定义「单键内存预算」要用 MEMORY USAGE,而不是字符串长度:对象与哈希表的固定开销在小对象上占比很高,用长度估算的偏差可能成倍。
对大集合执行 MEMORY USAGE 并且把采样设为 0 会很慢:它会遍历全部元素做精确统计,在生产实例上可能造成可观的阻塞,低峰或副本上执行更安全。
监控大盘中 used_memory 与 RSS 的差异属于碎片与分配器缓存,不必看到差异就紧张;结合碎片率一起判断,结论才可靠。