黑马点评项目实战(三)——缓存击穿

缓存击穿

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

image-20250215165622778

常见的解决方案有两种:互斥锁和逻辑过期。

互斥锁

image-20250215165828415

线程A发现缓存过期,加锁重建缓存,后续线程阻塞直至线程A释放锁,此时缓存重建成功。

优点:

  • 没有额外的内存消耗
  • 保证一致性
  • 实现简单

缺点:

  • 线程需要等待,性能受影响
  • 可能有死锁风险

业务实现:

关于如何加锁,这里使用redis的setmx(set if absent)来作为锁。

image-20250215170841707

逻辑过期

image-20250215170304356

不设置过期时间,但在value中添加逻辑过期字段,线程A查询热点key发现value中逻辑时间过期,则线程A加锁并另起线程B重建缓存,线程A直接返回旧数据(不需等待线程B执行结束),后续线程C查询缓存发现过期后尝试加锁,如果加锁失败则说明有线程正在重建缓存,线程C也直接返回旧数据即可。

优点:

  • 线程无需等待,性能较好

缺点:

  • 不保证一致性
  • 有额外内存消耗
  • 实现复杂

业务实现:

image-20250215173044007