大 key 是什么
大 key 指单个键的数据量或元素数量远超合理范围,例如几十万元素的 Hash、上百万元素的 ZSet、几 MB 的 String。它们的问题在于「一次操作卡一次」:单线程处理大对象的序列化、删除和网络传输都会阻塞其它请求。redis-cli 提供 --bigkeys 按类型找最大键,--memkeys 则按内存占用排序。
基本信息
| 扫描命令 | redis-cli --bigkeys / redis-cli --memkeys |
|---|---|
| 限速参数 | -i 秒数,线上扫描必加 |
| 采样深度 | --memkeys-samples 控制内存估算采样 |
| 精确手段 | MEMORY USAGE key 给出单键内存(含对象开销) |
| 安全替代 | SCAN 渐进遍历,生产禁用 KEYS |
典型使用场景
- 内存告警后定位具体是哪个键占了大量空间
- 延迟毛刺排查时验证是否存在大对象
- 活动或大促之前做容量复核
- 确定清理目标,避免误删业务正在使用的键
- 拆分方案设计前的现状摸底
扫描与确认
扫描与确认
redis-cli --bigkeys # 各类型最大的键(按元素数量)
redis-cli --bigkeys -i 0.1 # 每扫描 100 个键休眠 0.1 秒限速
redis-cli --memkeys # 按内存占用排序,更贴近真实成本
redis-cli --memkeys --memkeys-samples 5
MEMORY USAGE big:hash # 单键精确内存
HLEN big:hash # 元素数量,判断拆分粒度
redis-cli -h 从库IP -p 6379 --bigkeys -i 0.1 # 优先在从库上扫描手段与注意点
| 手段 | 覆盖范围 | 注意事项 |
|---|---|---|
| --bigkeys | 按元素数量给出各类型最大键 | 只看数量,不反映内存占用 |
| --memkeys | 按内存占用排序 | 需要较新版本,采样深度可调 |
| MEMORY USAGE | 单键精确内存 | 加大采样会遍历全键,慎用 |
| HLEN / ZCARD / SCARD | 元素数量 | 快速判断是否超过阈值 |
| SCAN | 渐进遍历键空间 | 生产可用的替代方案,需自行聚合 |
--bigkeys 与 --memkeys 都会遍历键空间:百万键实例上不加 -i 相当于全量扫描,可能直接制造延迟毛刺。安排在低峰或从库上执行。
只看元素数量容易漏判:一个只有几条记录但每条都很长的 String 同样是大 key。判断要结合 MEMORY USAGE 与业务语义,例如单值是否超过几十 KB。
发现大 key 后不要直接用 DEL 删除:删除大对象的开销同样阻塞单线程,应改用 UNLINK 异步删除,或分批删元素后再处理空结构。