MEMORY STATS 是什么
MEMORY STATS 用字段与值的数组形式一次性给出内存构成:分配器统计、数据集大小与占比、峰值、各类客户端缓冲、复制积压、Lua 缓存、每个数据库的键数与开销。它比 INFO memory 的扁平字段层次更清楚,适合脚本采集后做趋势对比,用来回答内存到底花在哪。
基本信息
| 命令 | MEMORY STATS |
|---|---|
| 版本 | Redis 4.0 及以上 |
| 输出 | 嵌套结构的字段与值数组 |
| 重点字段 | dataset.bytes、dataset.percentage、peak.allocated、overhead.total |
| 单位 | 字节为主,ratio 类字段为比值 |
| 采集建议 | 分钟级低频采集,秒级指标用 INFO memory |
典型使用场景
- 内存归因:dataset 占比低时,说明开销在连接、缓冲或分配器碎片上
- 趋势监控:定期采集 peak.allocated 与 dataset.bytes,发现缓慢泄漏
- 排查 RSS 与 used_memory 的差距:看 allocator 段与碎片字段
- 复制与持久化排障:看复制积压和 AOF 缓冲是否异常增长
- 上线前后对比:记录平均每键占用,评估数据结构是否合适
最小示例
最小示例
redis-cli MEMORY STATS # 完整输出,字段较多
redis-cli MEMORY STATS | grep -A1 dataset # 只取数据集相关字段
redis-cli MEMORY STATS | grep -A1 overhead # 各类开销来源
redis-cli INFO memory | grep used_memory_dataset_perc # 与 INFO 口径对照
redis-cli MEMORY DOCTOR # 让 Redis 自己给一段内存诊断结论重点字段读法
| 字段 | 含义 | 异常信号 |
|---|---|---|
| dataset.bytes | 数据集本身占用的字节 | 增长曲线应与业务键量一致,脱节就要查 |
| dataset.percentage | 数据集占已用内存的比例 | 明显偏低说明开销或碎片吃掉了内存 |
| peak.allocated | 历史峰值分配量 | 远高于当前值说明曾有突发,核对 maxmemory 水位 |
| overhead.total | Redis 自身结构开销合计 | 随客户端数增长,突增先查连接数 |
| keys.bytes-per-key | 平均每键占用字节 | 突然变小常是键名膨胀、键数暴增 |
| allocator-fragmentation.ratio | 分配器碎片率 | 长期远大于 1 说明碎片严重,可考虑重启或清理 |
MEMORY STATS 要遍历各库统计键数与均值,键极多时本身有开销,不要放进秒级采集;秒级监控用 INFO memory。
字段会随版本增删,采集脚本按字段名取值并按未知字段容错,不要按数组下标解析。