缓存击穿:一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。

缓存雪崩:大量Key同时失效 缓存击穿:大量请求访问同一个Key
缓存击穿的常见解决方案:
互斥锁(确保一致性、牺牲服务可用性)
- 优点:没有额外的内存消耗,保证一致性,实现简单。
- 缺点:线程需要等待、性能较低,可能有死锁风险。

逻辑过期 (确保服务可用性,牺牲一致性)
- 优点:线程无需等待,性能较好,不会影响并发能力。
- 缺点:不保证一致性、有额外内存消耗,实现复杂。

对比:

互斥锁更加易于实现,但是加锁会导致这些并发的线程 并行 变成 串行 ,导致系统性能下降,还可能 发生不同业务之间的死锁。
逻辑过期实现起来相较复杂,因为需要额外维护一个逻辑过期时间,有额外的内存开销,但是通过异步开启子线程重建缓存,使原来的同步阻塞变成异步,提高系统的响应速度,在重建缓存这段时间内,其他线程来查询缓存发现缓存已过期,会直接返回过期数据。