MEMORY USAGE 是什么
MEMORY USAGE key 返回一个键连同它的值在内存中占用的估算字节数,含键名、值对象、内部编码(SDS 头、dict 表项、跳表结点等)以及分配器对齐后的开销,是拆大 key、核算单键成本最直接的工具。Redis 4.0 起提供,对集合类结构可以用 SAMPLES 控制采样深度。
基本信息
| 命令 | MEMORY USAGE key [SAMPLES count] |
|---|---|
| 版本 | Redis 4.0 及以上 |
| 单位 | 字节 |
| SAMPLES | 默认 5,设为 0 表示全量采样(更准也更慢) |
| 支持类型 | string、list、hash、set、zset、stream 全类型 |
| 键不存在 | 返回空(nil) |
典型使用场景
- 拆大 key:先按字节数排序,定位真正吃内存的键再动手拆分
- 核算单键成本:估算一个 session 或活跃用户对象占多少字节,反推容量
- 验证优化效果:调整 hash 分桶或元素大小后,对比优化前后的字节数
- 确认编码是否生效:列表从紧凑编码转成普通编码时,单键体积会明显跳变
- 配合 OBJECT FREQ:找出又大又热的键,优先治理收益最大
最小示例
最小示例
redis-cli MEMORY USAGE session:1001 # 单键的估算字节数
redis-cli MEMORY USAGE big:hash:1 # 集合类默认只采样 5 个元素
redis-cli MEMORY USAGE big:hash:1 SAMPLES 0 # 全量采样,更准但更耗时
redis-cli -n 0 MEMORY USAGE user:1 # 指定第 0 号库查询
redis-cli --memkeys # 全库扫描,输出内存占用排行结果怎么用
| 观察 | 含义 | 动作 |
|---|---|---|
| 单键几百 KB | 典型大 key | 拆分或用 hash 分桶,避免单次操作阻塞 |
| 单键几十 MB | 严重大 key | 优先治理,删除用 UNLINK 或分批,别直接 DEL |
| 元素多但字节不大 | 小元素、高条数 | 重点看元素数量对 O(N) 命令的影响 |
| 返回空(nil) | 键不存在 | 确认键名与所选数据库 |
估算值含分配器对齐与对象头开销,和「元素个数乘元素大小」的直觉算法会有差距,做容量规划时以命令结果为准更稳妥。
它是单键测量,不给全库分布;要摸整体分布用 --memkeys 扫描或离线分析 RDB,线上避免 KEYS 全量遍历。
同一个键在优化前后对比才有意义:换实例、换版本(内部分配策略会变)后数值不可直接比较。做容量测算时按「键数 × 平均字节数」再留 20% 以上余量给碎片与复制缓冲。