适用场景

Redis 变慢常见两类原因:大 key 阻塞单线程,热 key 压垮单节点。两者都要先用扫描与监控定位,再决定拆分或拆分+本地缓存。改的时候要小心,别一边治理一边打挂线上。

配置步骤(大 key 排查与清理)

# 1) 采样扫描(生产慎用,建议从库或低峰执行)
redis-cli --bigkeys
redis-cli --memkeys

# 2) 精确判断某个 key 占用
redis-cli memory usage biz:order:list
redis-cli object encoding biz:order:list
redis-cli llen biz:order:list
redis-cli hlen biz:user:hash

# 3) 安全删除大 key(异步)
redis-cli unlink biz:order:list

# 4) 批量扫描(示例:按前缀 SCAN)
redis-cli --scan --pattern 'biz:order:*' --count 1000 | head -50

# 5) 慢日志与阻塞记录
redis-cli slowlog get 20
redis-cli info stats | grep -E 'blocked|expired'

关键参数与建议

  • 大 key 标准:String > 10KB、集合元素数 > 5000 视为需要关注
  • 扫描方式:SCAN 遍历 + MEMORY USAGE,禁止线上使用 KEYS
  • 热 key 识别:监控单 key QPS,或采样客户端命令统计
  • 大 key 治理:拆分为多个小 key(按时间/分片),或用 Hash 分桶
  • 热 key 治理:本地缓存、多副本随机读、限流与降级
  • 删除方式:大 key 用 UNLINK 异步删除,避免阻塞
  • 预防机制:写入侧限制单 key 大小,代码评审加检查项

容易踩的坑

  • 线上直接 KEYS *,直接把实例卡死
  • 用 DEL 删除百万级集合,主线程阻塞数秒
  • 只看元素数不看实际内存,Hash 字段过长同样致命
  • 大 key 改拆分方案但没做兼容,旧数据读不到
  • 扫描任务在业务高峰跑,QPS 抖动
  • 清理后没有写入侧约束,过一段时间又出现

验证与巡检

# 清理后复核
redis-cli --bigkeys | tail -20
redis-cli info memory | grep -E 'used_memory_human|mem_fragmentation_ratio'
redis-cli dbsize

# 阻塞与慢命令
redis-cli slowlog len
redis-cli info commandstats | sort -t= -k2 -rn | head -10
  • 巡检:无 >10KB String、无 >5000 元素集合、内存水位 < 70%、慢日志无新增

小结

Redis 治理验收:线上无大 key、热 key 有副本或本地缓存、单节点内存与 QPS 水位可控、写入侧有约束防止复发。

> 说明:文中命令为通用写法,不同型号/版本可能略有差异,落地前请对照设备实际版本的官方文档;带外管理与安全设备变更建议先在测试设备验证。