网易首页 > 网易号 > 正文 申请入驻

Redis 热 Key 导致缓存击穿、服务雪崩、CPU 打满问题深度解析。

0
分享至

Redis 热 Key 导致缓存击穿、服务雪崩、CPU 打满问题深度解析。
这篇非常适合承接上一篇 MySQL 锁失效,形成“缓存 + 数据库”的线上高并发故障排查系列。
Redis实战复盘:热Key导致缓存击穿、服务雪崩、CPU打满、数据库打爆彻底解决。
前言
在高并发系统中,Redis 常被用来做热点数据缓存,例如:
- 商品详情
- 活动配置
- 秒杀库存
- 首页横幅
- 系统配置
- 用户会话信息
很多开发者认为:只要把数据放进 Redis,就能扛住高并发。
但如果 Key 设计不合理,某个热点 Key 被大量请求同时访问,就可能出现:
- Redis 单节点 CPU 打满
- 缓存击穿
- 缓存穿透
- 服务雪崩
- 数据库被打爆
- 接口大面积超时
本文基于真实电商秒杀活动故障,还原热 Key 问题、分析底层原因、给出生产级解决方案。




一、真实线上故障场景还原
1.1 业务背景
电商平台举办限时秒杀活动,某个爆款商品瞬间涌入大量用户请求。
商品详情接口逻辑如下:
1. 先从 Redis 查询商品详情缓存
2. 如果缓存命中,直接返回
3. 如果缓存未命中,查询数据库
4. 查询结果回写 Redis
5. 返回商品详情
开发预期:Redis 能扛住所有并发请求。
1.2 故障现象
活动开始后,系统迅速出现异常:
- Redis 单节点 CPU 飙升
- 商品详情接口响应变慢
- 大量请求超时
- 数据库查询压力陡增
- 部分服务实例线程池被打满
- 首页和商品页出现降级提示
1.3 错误代码逻辑
java
public ProductDetail getProductDetail(Long productId) {
String key = "product:detail:" + productId;
String cacheValue = redisTemplate.get(key);
if (cacheValue != null) {
return JSON.parseObject(cacheValue, ProductDetail.class);
}
ProductDetail detail = productMapper.selectById(productId);
if (detail != null) {
redisTemplate.set(key, JSON.toJSONString(detail), 30, TimeUnit.MINUTES);
}
return detail;
}
这段代码看起来没有明显问题,但在高并发热点商品场景下存在严重风险。
二、热 Key 问题为什么会导致雪崩
2.1 什么是热 Key
热 Key 是指某个 Key 在短时间内被大量请求同时访问。
例如:
text
product:detail:10001
如果这个商品是秒杀爆款,可能瞬间产生几万甚至几十万次查询。
2.2 Redis 单线程模型压力集中
Redis 核心执行模型是单线程的。
虽然 Redis 性能很高,但如果所有请求都集中到同一个 Key 上,就会出现:
- 单个 Redis 实例 CPU 升高
- 命令排队
- 响应延迟增加
- 超时请求增多
- 重试风暴加剧压力
2.3 缓存击穿风险
如果某个热 Key 过期或被删除,大量请求会同时打到数据库。
例如:
1. 热点 Key 过期
2. 上万个请求同时未命中缓存
3. 同时查询数据库
4. 数据库 CPU 升高
5. 接口雪崩
这就是典型的缓存击穿。
2.4 服务层线程被打满
大量请求同时等待 Redis 响应或数据库查询,会导致:
- Tomcat / Jetty 线程池耗尽
- 网关层超时
- 服务熔断
- 用户体验下降
- 连锁影响其他业务接口
三、热 Key 常见产生场景
3.1 秒杀活动
某个限量商品瞬间被大量用户点击。
text
秒杀商品ID = 10001
所有请求都访问同一个 Key。
3.2 首页热点配置
首页活动配置、Banner 信息、公告信息被大量用户同时访问。
text
home:banner:20250602
3.3 大V内容访问
某个热门内容、视频、文章被瞬间曝光。
text
content:detail:99999
3.4 全局系统配置
系统开关、活动状态、配置参数被频繁读取。
text
config:activity:status
3.5 用户维度热点数据
某个高曝光用户的信息被大量查询。
text
user:profile:88888
四、生产级解决方案
方案一:热点 Key 本地缓存(Caffeine / Guava Cache)
对于热点数据,可以在服务层使用本地缓存,减少 Redis 访问压力。
java
private static final LoadingCache LOCAL_CACHE = Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.SECONDS)
.build(new CacheLoader() {
@Override
public ProductDetail load(Long productId) throws Exception {
String key = "product:detail:" + productId;
String value = redisTemplate.get(key);
if (value != null) {
return JSON.parseObject(value, ProductDetail.class);
}
return productMapper.selectById(productId);
}
});
优点:
- 减少 Redis 压力
- 响应速度快
- 适合超高热点场景
缺点:
- 多实例缓存不一致
- 内存占用增加
- 需要合理设置过期时间
方案二:Key 副本分散(热 Key 分片)
将一个热 Key 拆成多个副本 Key,让请求分散到不同 Redis Key。
text
product:detail:10001:0
product:detail:10001:1
product:detail:10001:2
product:detail:10001:3
写入时:
java
for (int i = 0; i < 4; i++) {
String key = "product:detail:" + productId + ":" + i;
redisTemplate.set(key, value, 30, TimeUnit.MINUTES);
}
读取时:
java
int index = ThreadLocalRandom.current().nextInt(4);
String key = "product:detail:" + productId + ":" + index;
return redisTemplate.get(key);
优点:
- 分散 Redis 单 Key 压力
- 降低单点热 Key 风险
- 实现相对简单
缺点:
- 存储空间倍增
- 更新时需要同步多个 Key
方案三:缓存永不过期 + 后台刷新
对于热点数据,不依赖自动过期,而是由后台任务异步刷新缓存。
java
public String getProductDetail(Long productId) {
String key = "product:detail:" + productId;
String value = redisTemplate.get(key);
if (value != null) {
return value;
}
ProductDetail detail = productMapper.selectById(productId);
if (detail != null) {
redisTemplate.set(key, JSON.toJSONString(detail));
asyncRefreshTask.refreshLater(productId);
}
return JSON.toJSONString(detail);
}
优点:
- 避免热点 Key 过期击穿
- 缓存可用性更高
缺点:
- 数据更新有延迟
- 需要异步刷新机制
方案四:互斥锁重建缓存
当缓存失效时,只允许一个线程去重建缓存,其他线程等待或降级返回。
java
public ProductDetail getProductDetailSafe(Long productId) {
String key = "product:detail:" + productId;
String value = redisTemplate.get(key);
if (value != null) {
return JSON.parseObject(value, ProductDetail.class);
}
String lockKey = "lock:product:detail:" + productId;
Boolean locked = redisTemplate.tryLock(lockKey, 5, TimeUnit.SECONDS);
if (locked) {
try {
ProductDetail detail = productMapper.selectById(productId);
if (detail != null) {
redisTemplate.set(key, JSON.toJSONString(detail), 30, TimeUnit.MINUTES);
}
return detail;
} finally {
redisTemplate.unlock(lockKey);
}
} else {
// 等待重试或返回降级数据
return fallbackProductDetail(productId);
}
}
优点:
- 防止缓存击穿
- 避免数据库被打爆
缺点:
- 实现复杂
- 可能影响用户体验
- 需要注意锁释放
方案五:服务层限流与熔断
在网关或服务接口层对热点商品请求进行限流。
例如:
- 单用户每秒最多访问 5 次
- 单商品全局限流
- 超过阈值返回降级页面
- 高峰期开启保护模式
优点:
- 保护后端资源
- 防止雪崩扩散
缺点:
- 用户可能被限流
- 需要合理配置阈值
五、热 Key 检测与监控
5.1 Redis 热 Key 监控
可以通过 Redis 监控系统观察:
- 某个 Key 的 QPS
- 某个 Key 的 CPU 耗时
- 某个 Key 的访问频率
- 某个 Key 的过期命中率
5.2 业务热点识别
活动开始前,提前识别热点商品:
text
秒杀商品
爆款商品
首页活动
热门内容
系统配置
对这些资源提前做保护。
5.3 压测验证
大促前必须压测热点 Key 场景:
text
单商品QPS 10000
单商品QPS 50000
单商品QPS 100000
观察 Redis、数据库、服务线程池表现。
六、企业级编码规范
1. 秒杀、爆款、首页配置类热点数据,必须提前做热 Key 保护;
2. 高热点数据优先使用本地缓存 + Redis 缓存二级结构;
3. 单个 Redis Key 不能承担无限流量,必要时做 Key 分片;
4. 缓存过期不能集中失效,热点数据使用永不过期 + 后台刷新;
5. 缓存重建必须防击穿,禁止大量请求同时查库;
6. 热点接口必须有限流、熔断、降级机制;
7. 大促前必须提前识别热点 Key,并纳入压测范围。
七、总结
Redis 热 Key 问题的本质不是 Redis 不够快,而是流量集中到单个资源点后引发连锁雪崩。
生产环境推荐组合方案:
- 热点数据:本地缓存
- 超高热点:Key 分片
- 缓存重建:互斥锁或后台刷新
- 接口保护:限流熔断
- 大促前:热点识别 + 压测验证
核心准则:不要让一个 Key 扛住全世界,也不要让一次缓存过期打爆整个系统。
版权与友链信息
版权归属:凡尘
友情链接:凡尘博客 fanchenblog.com、wz.fanchenblog.com、雨落凡尘博客 b.fanchenblog.com、t.fanchenblog.com、凡尘乡音 y.fanchenblog.com、凡尘影院 a.fanchenblog.com

声明:个人原创,仅供参考

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
网友:“这个‘中华老字号’是假的吧!避雷!”黄浦:连夜执法,现已停业!

网友:“这个‘中华老字号’是假的吧!避雷!”黄浦:连夜执法,现已停业!

上海黄浦
2026-08-01 16:38:03
隔代亲能厉害到什么程度?网友:能打败嫡长子的只有嫡孙子!

隔代亲能厉害到什么程度?网友:能打败嫡长子的只有嫡孙子!

另子维爱读史
2026-07-31 20:21:42
美签保证金计划成效惊人:50国非法滞留人数骤降99.9%

美签保证金计划成效惊人:50国非法滞留人数骤降99.9%

大洛杉矶LA
2026-08-01 06:11:01
“原来韦神和王虹的差距这么大!”人民日报连发多轮报道,才令人看清现实

“原来韦神和王虹的差距这么大!”人民日报连发多轮报道,才令人看清现实

妍妍教育日记
2026-07-29 17:55:01
整个亚洲无影厅可完美播映《奥德赛》

整个亚洲无影厅可完美播映《奥德赛》

看看新闻Knews
2026-07-30 12:38:11
詹姆斯用一场热身赛定下76人队新赛季的基调:夺冠

詹姆斯用一场热身赛定下76人队新赛季的基调:夺冠

刘哥谈体育
2026-08-01 01:34:36
AI还是量子计算?两家公司营收差距超6倍,盈利状况天差地别

AI还是量子计算?两家公司营收差距超6倍,盈利状况天差地别

闪存猎手
2026-07-31 15:21:08
英特尔前CEO深度反思:十年没买一台光刻机,却花了1000亿美金回购股票!持续15年让财务人掌舵,错过iPhone芯片和移动时代!

英特尔前CEO深度反思:十年没买一台光刻机,却花了1000亿美金回购股票!持续15年让财务人掌舵,错过iPhone芯片和移动时代!

投资者内参
2026-07-27 09:41:29
《X战警》新电影白皇后演员敲定!萨玛拉·维文出演

《X战警》新电影白皇后演员敲定!萨玛拉·维文出演

阿废冷眼观察所
2026-08-01 15:38:58
中国男篮大敌!八村塁官宣时隔两年回归日本男篮 将战8月世预赛

中国男篮大敌!八村塁官宣时隔两年回归日本男篮 将战8月世预赛

醉卧浮生
2026-08-01 19:29:00
安徽准南一女子砸150万开店日营业额仅584元,当场崩溃痛哭!

安徽准南一女子砸150万开店日营业额仅584元,当场崩溃痛哭!

天天热点见闻
2026-07-29 10:21:58
受权发布|中华人民共和国国务院令  第841号

受权发布|中华人民共和国国务院令  第841号

新华社
2026-07-31 17:03:03
同学聚会,未婚妻班花在众人起哄下拥吻了校草,我当即分手远走,多年后老家相遇,她瞬间红了眼眶颤抖说后悔

同学聚会,未婚妻班花在众人起哄下拥吻了校草,我当即分手远走,多年后老家相遇,她瞬间红了眼眶颤抖说后悔

晓艾故事汇
2026-07-31 08:25:45
外卖小哥深夜自述,去年还是曾经手握两家汽贸公司开路虎的老板,如今跑外卖还债,老婆也跑了

外卖小哥深夜自述,去年还是曾经手握两家汽贸公司开路虎的老板,如今跑外卖还债,老婆也跑了

捣蛋窝
2026-07-28 19:12:40
动作巨星出演柳条人预告炸裂,全网疯盯着他那对柳条乳头不肯放

动作巨星出演柳条人预告炸裂,全网疯盯着他那对柳条乳头不肯放

自愈小日子
2026-08-01 00:47:55
他汀立新功!哈佛研究:这2种他汀不仅不伤肝,还能降低肝癌风险

他汀立新功!哈佛研究:这2种他汀不仅不伤肝,还能降低肝癌风险

健康之光
2026-08-01 19:15:04
美媒评NBA历史十大单核表演,06科比入选,11司机仅第5,07詹姆斯第2

美媒评NBA历史十大单核表演,06科比入选,11司机仅第5,07詹姆斯第2

弄月公子
2026-08-01 22:12:52
是挺失败的!董宇辉访谈周星驰后,《功夫女足》预测降了7000万

是挺失败的!董宇辉访谈周星驰后,《功夫女足》预测降了7000万

娱乐故事
2026-07-31 11:35:39
韦德:选秀前医生告诉热火我的膝盖只能撑5年,后来果然如此

韦德:选秀前医生告诉热火我的膝盖只能撑5年,后来果然如此

懂球帝
2026-08-01 11:28:07
雷军憋了三年半的大招亮相:26万的增程SUV,把理想问界逼到墙角

雷军憋了三年半的大招亮相:26万的增程SUV,把理想问界逼到墙角

娱乐圈的笔娱君
2026-08-01 14:01:22
2026-08-01 23:03:00
情字白头369
情字白头369
个人生活中所拍摄的照片以及成长过程中的心得感悟
6文章数 0关注度
往期回顾 全部

科技要闻

特斯拉拆不掉中国制造

头条要闻

特朗普赞叹:伊朗确实挺硬气 换大多数人早认输了

头条要闻

特朗普赞叹:伊朗确实挺硬气 换大多数人早认输了

体育要闻

1米76的他,为什么是史上最强中卫之一?

娱乐要闻

韩路批董宇辉“又当又立”?

财经要闻

长鑫科技四万亿市值背后的资本与周期

汽车要闻

限时17.99万元 全新一代天工08 670 Max正式上市

态度原创

手机
艺术
本地
教育
公开课

手机要闻

REDMI K100 Pro系列细节公布,第五代骁龙8至尊版加持

艺术要闻

越南人疯了?将建568米高双子塔,刷新5项世界纪录

本地新闻

神仙也“蓉”漂,哪吒与八仙,皆是成都出品!

教育要闻

录取通知书何时发放?相关解答

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版