缓存击穿(Cache Breakdown / Stampede)
缓存击穿指的是某个热点 Key 被大量并发访问,在其缓存失效或过期的瞬间,所有请求同时打到数据库,造成数据库压力骤增甚至宕机,就像缓存这座“屏障”被“凿开”一个洞。
常见解决方案整理与补充
- 互斥锁(Mutex / Distributed Lock)
原理:当缓存失效时,仅允许一个线程获取锁,去查询数据库并重建缓存,其余线程等待或返回缓存结果。
实现方式: 单体服务用互斥锁,分布式用分布式锁
Tips: 采用“双重判定锁”(Double-checked locking):获取锁后再次检查缓存,避免重复查询数据库。
优缺点:
优点:有效防止大量并发查询数据库
缺点:实现较复杂,可能带来性能瓶颈。
- 互斥锁(Mutex / Distributed Lock)
- 热点数据永不过期 / 逻辑过期 + 后台刷新
物理永不过期:将热点 Key 设置为永不过期,确保缓存一直命中,定期由后台异步任务刷新缓存数据
优缺点:
优点:避免缓存穿透,保持高可用
缺点:增加实现复杂度,需处理数据一致性问题与过期逻辑。
- 热点数据永不过期 / 逻辑过期 + 后台刷新
- 热点数据预加载(Cache Preload / Warming)
机制:在系统启动或业务高峰到来前,把已知的热点数据加载到缓存中,避免初次访问击穿缓存。
- 热点数据预加载(Cache Preload / Warming)