--memkeys 是什么
redis-cli --memkeys 按单键内存占用统计全库,直接给出各类型里最占内存的键,比 --bigkeys 的元素数口径更贴近内存问题。它底层用 SCAN 迭代遍历全部键,所谓采样指的是集合类型内部元素的采样深度,而不是跳过键;因此在大实例上耗时长,需要用限速参数控制影响。
基本信息
| 命令 | redis-cli --memkeys |
|---|---|
| 统计口径 | 单键内存占用,与 MEMORY USAGE 同源 |
| 采样参数 | --memkeys-samples <n>,0 表示全量采样 |
| 限速参数 | -i <秒> 控制 SCAN 之间的间隔 |
| 遍历范围 | 当前连接节点的全部键(SCAN 迭代) |
| 使用前提 | 只读扫描,但仍占用 CPU 与带宽 |
典型使用场景
- 内存告警定位:按字节数排序,比按元素数排序更接近问题本身
- 大 key 治理前评估:确认是哪类结构、哪个键在吃内存
- 治理后复查:再扫一遍对比最大键是否回落
- 数据模型评审:发现某类结构普遍偏大,回到业务侧调整设计
- 迁移前评估:估算单键体积,决定是否需要拆分后再迁
最小示例
最小示例
redis-cli --memkeys # 直接扫描,输出各类型最大内存键
redis-cli --memkeys --memkeys-samples 5 # 只抽样元素,快但结果是估算
redis-cli --memkeys --memkeys-samples 0 -i 0.1 # 全量口径并限速,降低线上影响
redis-cli -n 0 --memkeys # 指定库扫描
redis-cli MEMORY USAGE big:hash:1 SAMPLES 0 # 复核单个键的真实字节数输出怎么读
| 输出项 | 含义 | 动作 |
|---|---|---|
| 采样键数 | 本次扫描到的键总量 | 与 DBSIZE 差距大说明期间有大量过期或扫描未覆盖 |
| 每类最大键 | 该类型中内存占用最大的键 | 优先治理;注意它只是样本中的最大 |
| 键名长度统计 | 键名本身的开销水平 | 偏长说明键名设计冗余,缩短能省内存 |
| 元素采样口径 | 集合内部只抽部分元素 | 要精确值再加 --memkeys-samples 0 |
它遍历的是全部键,慢的原因是遍历本身而不是采样;控制影响的手段是 -i 限速、避开高峰,以及优先在从库上执行。
集群模式下客户端只扫当前连接的节点,要逐主节点执行;扫描口径与单键 MEMORY USAGE 的采样参数不是一回事,比较数字时保持同一口径。