
1) 【一句话结论】实际项目中遇到缓存雪崩(如热点数据缓存失效),通过预加载+互斥锁+多级缓存组合策略可有效缓解,使数据库QPS从5000+下降至2000以下,响应时间从2秒降至0.3秒左右,系统稳定性显著提升。
2) 【原理/概念讲解】缓存雪崩是指缓存中大量热点数据(如秒杀商品、热门文章)同时失效,导致大量请求直接落库,数据库瞬间压力激增,系统响应变慢甚至崩溃。类比:冬天山上的雪突然全部滑落(雪崩),瞬间堵塞道路,车辆(请求)无法通过,只能绕到数据库(真实数据源)的“道路”上,导致数据库过载。核心是缓存失效时间点集中,触发大量并发请求。
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 预加载 | 在缓存失效前,提前将数据加载到缓存 | 主动预防,提前准备 | 热点数据,失效时间可预测 | 需预判失效时间,可能增加缓存占用 |
| 互斥锁 | 缓存失效时,通过锁保证仅一个线程加载新数据,其他请求等待 | 串行化加载,避免重复 | 数据量不大,或加载成本高 | 并发请求阻塞,QPS下降 |
| 多级缓存 | 采用多级缓存(如Redis+Memcached+本地缓存),缓存逐级失效 | 分层缓存,逐级处理 | 大规模系统,数据访问频繁 | 需设计缓存淘汰策略,避免数据不一致 |
4) 【示例】
假设项目有“秒杀商品”数据,缓存失效时间设为1小时。某天凌晨1点,缓存突然全部失效(如Redis集群故障),此时大量用户请求秒杀,直接请求数据库,导致数据库QPS从2000飙升至5000+,响应时间从0.2秒升至2秒以上,系统报错。
解决方案:
伪代码(请求流程):
用户请求商品信息 → 查本地缓存(无)→ 查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) 【追问清单】
7) 【常见坑/雷区】