缓存穿透、击穿、雪崩

文章目录

在并发学习的过程中,缓存是一个非常重要的知识模块。为什么使用缓存呢?第一,提升响应效率和并发量;第二,减轻数据库的压力。如果没有设计好缓存模块,造成了缓存穿透、缓存击穿、缓存雪崩,会导致大量请求访问到数据库,大并发的情况下会让数据库无法承担压力,造成系统崩溃。

缓存流程

通常情况下,一个请求过来,会先查询缓存,如果缓存存在,则直接返回,缓存不存在,则去数据库中查询。

缓存穿透

出现原因:由于缓存过期或被主动删除、查询缓存不存在等情况就会出现缓存穿透。
解决方案:

  1. 当数据库查询不存在时,设置缓存为空或NULL,防止下次穿透
  2. 使用布隆过滤器。数据写入时,在布隆过滤器中进行标记,当缓存查询不存在的时候,对布隆过滤器进行查询是否存在。如果不存在,则数据库中也不存在,直接返回空或失败

缓存击穿

出现原因:当某个缓存失效的瞬间大量请求转发到数据库
解决方案:

  1. 使用互斥锁,只让一个线程构建缓存,其他线程等待构建缓存执行完毕,重新从缓存中获取数据。单机通过synchronized或lock来处理,分布式环境采用分布式锁
  2. 不设置过期时间,后台异步更新缓存
  3. ”提前“使用互斥锁,在value内部设置一个比缓存过期时间短的过期时间标识,当异步线程发现该值快过期时,马上延长内置的这个时间,并重新从数据库加载数据,设置到缓存中去

缓存雪崩

出现原因:当大量缓存同时失效或缓存中间件服务器宕机的情况下,导致的大量请求转发到了数据库
解决方案:

  1. 将缓存的过期时间加上一个随机数(比如随机1-5分钟),让缓存均匀的失效
  2. 使用队列或锁,单线程控制缓存,但可能影响到并发
  3. 热点数据可以考虑不失效,后台异步更新缓存
  4. 双缓存策略,主缓存设置过期时间,备用缓存不设置过期时间,当主缓存失效时,返回备用缓存
  5. 构建分布式缓存
  6. 当缓存雪崩发生时,服务熔断、限流、降级等措施
原文链接:,转发请注明来源!
评论已关闭。