Skip to content
缓存、消息与检索故障排查 · 第 1 篇 / 共 5 篇
领域生产问题
专题数据与基础设施排障专题
当前序列缓存、消息与检索故障排查
阅读位置第 1 篇 / 共 5 篇当前专题第 2 个序列 / 共 5 个序列

Redis 热 Key 突增时怎么止血和回查

Redis 热 Key 故障很典型:

  • 业务看起来像“缓存很快”
  • 但单个 key 被瞬时打爆
  • 某个 Redis 分片 CPU 飙升、网络流量激增
  • 上游接口 RT 抖动,甚至开始回源打数据库

这类问题最怕两件事:
一是把它当成普通 Redis 慢查询,二是只会扩容,不会先止血。

先说结论

  • 热 Key 故障的核心不是 Redis 变慢,而是流量过度集中到单个 key 或单个分片
  • 第一目标永远是止血: 限流、降级、热点隔离、短期本地缓存
  • 第二目标才是回查根因: 为什么流量突然集中、为什么热点没有提前打散
  • 根因通常在业务流量模型、缓存设计和热点预案,而不只是 Redis 参数

一个典型故障现象

以商品详情接口为例,某次大促前首页把一个爆款商品推到全站:

  • 大量请求集中打到 product:detail:1001
  • 对应 Redis 分片 QPS 和出口流量陡增
  • 接口 RT 从 20ms 飙到 300ms
  • 少量请求因超时开始回源 MySQL
  • MySQL 连接数也开始上升

这时如果不及时处理,很快会从“单 key 热点”扩散成“缓存 + 数据库双抖动”。

很多真正的事故都不是 Redis 单点慢一点,而是:

  • Redis 热点先抖
  • 应用超时增加
  • 请求开始回源数据库
  • 数据库连接数和慢 SQL 一起被放大

所以这类问题的关键不是“怎么看 Redis”,而是怎么在热点扩散前先止血。

第一阶段: 先止血

1. 限流

对热点接口、热点商品、热点用户维度做临时限流。
目的是先把进入应用层和 Redis 的总流量压下来。

2. 本地缓存兜一层

如果热点数据变化不频繁,可以在应用实例内临时加短 TTL 本地缓存,比如 1 到 3 秒。
这样很多重复请求不用都打到 Redis。

3. 降级非核心字段

商品详情页里如果有推荐、评论摘要、运营标记等非核心信息,可以先降级,减少一次请求内的 Redis 次数。

4. 必要时热点隔离

极端情况下,可以把这个热点 key 单独拆出来:

  • 复制到独立 key
  • 放到独立实例
  • 或单独走专门热点服务

5. 控制回源

如果 Redis 已经开始抖动,要优先确认回源策略是不是会瞬间把请求全部打到 MySQL、ES 或远程接口。

很多系统真正崩不是因为 Redis 顶不住,而是因为回源链路没有被保护住。

第二阶段: 确认是不是热 Key

常见观察信号:

  • 单个 Redis 节点 QPS、CPU、网络显著高于其他节点
  • 业务侧集中访问少量固定 key
  • 热点接口 RT 抖动和 Redis 节点抖动高度同步

排查时可以结合:

  • 应用日志里的 key 访问分布
  • Redis 慢日志和监控
  • 节点级命令统计
  • 接口维度的 top 参数

注意,热 Key 不一定会出现在慢日志里,因为单次命令可能很快,只是频率过高。

这点特别容易误导人:

  • 慢日志里没问题
  • 不代表热点没问题

热点问题本质是“频率异常高”,不是“单次执行特别慢”。

第三阶段: 回查根因

热 Key 常见根因通常是下面几类。

1. 热点流量天然集中

比如爆款商品、首页配置、热门活动、统一配置开关。
这些 key 天生容易热。

2. 缓存设计没有做打散

例如一个超热点配置全部实例都查同一个 key,没有:

  • 本地缓存
  • 多副本 key
  • 热点分桶

3. 上游场景发生变化

大促、运营推荐、推送消息、短视频带货、站外导流,都会把热点突然放大。

4. 回源策略过于脆弱

Redis 一旦抖动,请求立刻打 MySQL,导致问题扩散成缓存击穿。

5. 热点被放大但没有预热

运营活动、推荐位切换、消息推送、短视频导流,这些都可能把某个 key 的访问量在很短时间里放大很多倍。

热 Key 和大 Key 不要混淆

两者经常一起出现,但不是一回事:

  • 热 Key: 访问频率异常高
  • 大 Key: 单个 key 数据体积异常大

一个 key 可能又热又大,那会更糟:

  • 每次读取都重
  • 频率还高

排障时要分清楚是频率问题、体积问题,还是两者叠加。

一套更实用的长期治理方案

1. 建热点识别机制

对高频 key、热点接口参数、单节点 QPS 差异做监控告警。

2. 热点分级

把 key 分成:

  • 常规热点
  • 可预期大促热点
  • 突发异常热点

不同等级对应不同预案。

3. 设计多级缓存

对特别热点的数据,常见方案是:

  • 本地缓存
  • Redis
  • 必要时独立热点缓存服务

4. 做流量预热

大促前提前加载热点数据、预建本地缓存、预热网关限流规则。

5. 给热点回源链路加明确边界

包括:

  • 单 key 回源限流
  • 单机本地缓存兜底
  • 熔断与快速失败
  • 请求合并

这类问题里最常见的误区

1. 只想着扩 Redis

扩容能缓解,但如果热点仍然落在同一个分片规则上,问题不一定解决。

2. 发现热点后直接删 key

如果没有更稳的兜底策略,删 key 往往会引发更严重的回源风暴。

3. 没有把业务事件和热点关联起来

很多热 Key 问题其实是运营动作触发的。
技术侧如果只看 Redis 指标,不看业务活动,很容易找不到真正原因。

一个现场处理清单

当你在线上怀疑出现热 Key 时,可以先按这条顺序处理:

  1. 确认受影响接口和 key 范围
  2. 先限流和降级,避免问题扩散
  3. 对超热点数据补本地缓存或临时隔离
  4. 看是否有回源压力同步上升
  5. 复盘流量来源和缓存设计缺口

如果再细一点,我会补两步:

  1. 确认是不是只有一个分片明显异常。
  2. 看热点是否和某次活动、推送、推荐位变更时间点吻合。

总结

Redis 热 Key 故障的核心,不是单机性能调优,而是热点流量治理。
真正成熟的做法是:

  • 先止血
  • 再定位热点来源
  • 最后改缓存分层和业务预案

这样下次再遇到爆款流量,系统才不会又被同一个点打穿。真正要治理的不是 Redis 参数,而是热点流量如何被识别、缓冲、隔离和兜底。

延伸阅读相关文章优先当前专题,再补跨专题关联。
同一序列 · 顺着当前主线继续读Kafka 积压突然飙升时怎么排查适合把 Redis 热点、Kafka 积压、ES 慢查询和 ClickHouse 超时放在一条排障线上看。应用运行时排障专题 · 应用运行时典型故障案例同一序列 · 顺着当前主线继续读Elasticsearch 查询突然变慢时怎么定位适合把 Redis 热点、Kafka 积压、ES 慢查询和 ClickHouse 超时放在一条排障线上看。应用运行时排障专题 · 应用运行时典型故障案例同专题其他序列 · 共享标签:案例排障接口 RT 飙升但 CPU 不高时怎么排查适合把 CPU、Full GC、线程池和接口超时这类应用层异常放在一组里看。应用运行时排障专题 · 应用运行时异常排查同专题其他序列 · 共享标签:案例排障接口超时排查为什么要区分 RT 和 queue wait适合把线程死锁、CPU 高、Full GC、接口超时和 OOM 现场保留放在一条运行时排障主线上看。应用运行时排障专题 · 应用运行时故障的现场与根因收敛跨专题关联 · 共享标签:Redis、案例排障Redis RT 抖动时先看命令还是网络适合把 Redis 抖动、MySQL 连接打满、MQ 积压、ES 发黄、ClickHouse 合并堆积和磁盘打满放在同一条基础设施排障主线上看。数据与基础设施排障专题 · 数据与基础设施故障的分层排查跨专题关联 · 同场景:线上排障大 Header、buffer、timeout 问题怎么排查适合把 location 匹配、缓冲区和负载均衡放在一起看。容器与站点部署专题 · Nginx 进阶路由与代理治理
继续阅读缓存、消息与检索故障排查当前序列第 1 篇 / 共 5 篇当前专题第 2 个序列 / 共 5 个序列
往前看
上一序列数据库与网关故障排查从第 1 篇开始:MySQL 连接数打满时怎么排查
往后看
下一篇RabbitMQ 队列积压时怎么排查继续当前序列下一章下一序列容器与编排异常排查从第 1 篇开始:Kubernetes Pod Pending 时怎么排查

把零散经验整理成可查、可复用、可持续更新的企业级知识门户