请解释缓存击穿现象,并谈谈你会采取哪些措施来应对这种场景?
考察说明
考查对缓存热点key失效瞬间导致高并发穿透数据库问题的理解及常见解决方案。
回答思路
- 【回答框架 1】缓存击穿指某个热点key在缓存中过期或不存在时,大量并发请求同时查询数据库,导致数据库压力骤增。它与缓存雪崩的区别在于雪崩是大量key同时失效,而击穿是单个热点key失效瞬间的峰值压力。
- 【回答框架 2】核心解决方案之一是互斥锁,在缓存未命中时只允许一个线程去加载数据并重建缓存,其他线程等待锁释放后直接读取缓存。可使用Redis的SETNX或分布式锁实现,但要注意锁的粒度、超时时间和避免死锁。
- 【回答框架 3】另一种方案是逻辑过期,在缓存数据中存储过期时间而不是直接删除key,当发现逻辑过期时,让一个线程去更新缓存,其他线程继续返回旧值,避免瞬间穿透。
- 【回答框架 4】对于热点key,还可以采用永不过期策略,后台异步更新,或使用多级缓存(本地缓存+分布式缓存)来分散压力。也可以对热点key主动预热,并在失效时间上增加随机值避免同时失效。
- 【回答框架 5】实际方案需结合场景,优先使用互斥锁或逻辑过期,并配合监控告警、限流降级,防止数据库被击穿。
- 【关键点 1】缓存击穿是单个热点key失效瞬间高并发穿透。
- 【关键点 2】互斥锁确保同一时间只有一个线程重建缓存。
- 【关键点 3】逻辑过期允许返回旧值,后台异步更新。
- 【关键点 4】多级缓存和主动预热可降低穿透风险。
- 【关键点 5】需结合监控、限流降级作为兜底。
- 【易错点 1】互斥锁实现不当可能造成死锁或锁失效,需设置超时并校验删除锁的线程身份。
- 【易错点 2】逻辑过期可能返回短暂旧数据,需评估业务对一致性的容忍度。
- 【易错点 3】永不过期策略需依赖定时更新,若更新失败会导致数据长时间不一致。