适用场景
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 水位可控、写入侧有约束防止复发。
> 说明:文中命令为通用写法,不同型号/版本可能略有差异,落地前请对照设备实际版本的官方文档;带外管理与安全设备变更建议先在测试设备验证。