51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

描述一个实际项目中遇到的缓存雪崩问题,比如某个缓存热点数据失效,导致大量请求落库,问如何解决(如加互斥锁、预加载、多级缓存),以及效果如何(如QPS下降多少,响应时间提升)?

360Web服务端开发工程师难度:中等

答案

1) 【一句话结论】实际项目中遇到缓存雪崩(如热点数据缓存失效),通过预加载+互斥锁+多级缓存组合策略可有效缓解,使数据库QPS从5000+下降至2000以下,响应时间从2秒降至0.3秒左右,系统稳定性显著提升。

2) 【原理/概念讲解】缓存雪崩是指缓存中大量热点数据(如秒杀商品、热门文章)同时失效,导致大量请求直接落库,数据库瞬间压力激增,系统响应变慢甚至崩溃。类比:冬天山上的雪突然全部滑落(雪崩),瞬间堵塞道路,车辆(请求)无法通过,只能绕到数据库(真实数据源)的“道路”上,导致数据库过载。核心是缓存失效时间点集中,触发大量并发请求。

3) 【对比与适用场景】

方案定义特性使用场景注意点
预加载在缓存失效前,提前将数据加载到缓存主动预防,提前准备热点数据,失效时间可预测需预判失效时间,可能增加缓存占用
互斥锁缓存失效时,通过锁保证仅一个线程加载新数据,其他请求等待串行化加载,避免重复数据量不大,或加载成本高并发请求阻塞,QPS下降
多级缓存采用多级缓存(如Redis+Memcached+本地缓存),缓存逐级失效分层缓存,逐级处理大规模系统,数据访问频繁需设计缓存淘汰策略,避免数据不一致

4) 【示例】
假设项目有“秒杀商品”数据,缓存失效时间设为1小时。某天凌晨1点,缓存突然全部失效(如Redis集群故障),此时大量用户请求秒杀,直接请求数据库,导致数据库QPS从2000飙升至5000+,响应时间从0.2秒升至2秒以上,系统报错。
解决方案:

  • 预加载:0点定时任务从数据库加载所有秒杀商品,存入Redis(失效时间1小时),失效前数据已更新。
  • 互斥锁:缓存失效时,通过分布式锁(如Redis SETNX)保证仅一个线程加载新数据,其他请求等待锁释放。
  • 多级缓存:本地缓存(JVM HashMap)缓存热点数据,优先查本地,若无再查Redis,若Redis无再查数据库,数据库加载后同步到Redis和本地缓存。

伪代码(请求流程):
用户请求商品信息 → 查本地缓存(无)→ 查Redis(无,失效)→ 加锁(成功)→ 从数据库加载 → 存入Redis/本地缓存 → 返回用户;其他请求等待锁释放。

5) 【面试口播版答案】(约80秒)
“面试官您好,我之前在360的电商项目中遇到过缓存雪崩。当时项目里的‘秒杀商品’缓存失效,导致大量请求落库。具体来说,缓存失效时间设为1小时,某天凌晨1点突然全部失效,数据库QPS从2000飙升至5000+,响应时间从0.2秒升至2秒,系统开始报错。解决方法用了三步:首先,预加载,提前1小时通过定时任务从数据库加载所有秒杀商品,存入Redis(失效时间1小时),这样失效前数据已更新;其次,加互斥锁,当检测到缓存失效时,通过分布式锁(如Redis的SETNX)保证仅一个线程加载新数据,其他请求等待锁释放,避免重复加载;最后,多级缓存,引入本地缓存(JVM的HashMap),缓存热点数据,减少Redis压力。效果上,预加载后失效时数据库压力从5000降到2000以下,响应时间从2秒降至0.3秒左右,系统恢复正常。总结来说,通过预加载+互斥锁+多级缓存组合,有效缓解了缓存雪崩,保障了系统稳定性。”

6) 【追问清单】

  • 问1:为什么选择预加载而不是其他方法?
    回答要点:预加载能主动预防,避免失效时集中请求,适合失效时间可预测的热点数据。
  • 问2:互斥锁会导致并发请求阻塞,那QPS会下降吗?
    回答要点:是的,但通过锁保证数据一致性,避免重复加载,结合预加载后整体QPS下降幅度可控,响应时间提升。
  • 问3:多级缓存如何设计?比如Redis和本地缓存的关系?
    回答要点:本地缓存优先查,若本地无再查Redis,若Redis无再查数据库,数据库加载后同步到Redis和本地缓存,减少Redis压力。
  • 问4:如果预加载失败怎么办?
    回答要点:设置重试机制,失败后延迟重试,避免影响后续失效时的数据加载。
  • 问5:缓存失效时间如何设置?
    回答要点:根据数据更新频率,比如秒杀商品每1小时更新一次,失效时间设为1小时,平衡缓存击穿和雪崩风险。

7) 【常见坑/雷区】

  • 坑1:只说一种方法,没提组合策略。比如只说加锁,没提预加载,效果不理想。
  • 坑2:效果描述不具体,比如只说“响应时间变快”,没量化(如QPS下降多少,响应时间提升多少),显得不专业。
  • 坑3:忽略缓存预热的时间点,比如预加载时间设置不合理,导致失效时数据还是旧版本。
  • 坑4:锁的粒度过大,比如锁整个表,导致并发度低,QPS下降严重。
  • 坑5:多级缓存的数据一致性处理不当,比如本地缓存和Redis数据不同步,导致数据不一致。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1