首页/数据/Redis 进阶速查/redis-cli --memkeys 内存视角扫描
性能与排障129 条

redis-cli --memkeys 内存视角扫描

redis-cli --memkeys 与 --bigkeys 类似但按 MEMORY USAGE 口径统计内存,直接指出内存占比高的键。

Redis 进阶速查数据更新于 2026-10-13

--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 的采样参数不是一回事,比较数字时保持同一口径。

易错点

  • 把单次输出当全集:扫描期间新写入的键不在样本里,结论必须注明采样时间
  • 在业务高峰跑全量口径扫描:只读也会持续占用 CPU 与带宽,应限速或改到低峰
  • 以为 --memkeys 只抽一部分键:它遍历全库,误判覆盖面会错估风险
  • 把各类型最大键当成真实值:集合元素是采样的,精确值还要用 MEMORY USAGE 复核
  • 只看最大值不看分布:长尾里众多中等偏大的键累积起来同样吃掉内存

数据来源与参考

  • Redis 官方文档:--memkeys 选项
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌