Redis缓存雪崩、击穿、穿透

Redis缓存雪崩、击穿、穿透

缓存:一般缓存都是定时任务去刷新,或者查询不到之后就去更新

雪崩

概念

当缓存服务器重启或者大量缓存数据集中再某一时间段失效(过期),这样在失效的时候,会给后端系统(DB)带来很大的压力,造成瞬时数据库请求量大、压力骤增,引起雪崩,甚至导致数据库被打挂

解决方案

  • 1.过期时间打散:给缓存时间加上一个随机数,避免同一时刻大量数据集中失效
  • 2.热点数据不过期:要着重考虑刷新的时间间隔和数据异常如何处理的情况
  • 3.增加互斥锁:按 key 维度加锁,对于同一个 key,只允许一个线程去计算,其他线程原地阻塞等待第一个线程的计算结果,然后直接走缓存即可

击穿

概念

缓存击穿是指一个key非常热点,不停地扛着高并发,并发集中在这一个点上请求,当这个key过期失效时,持续的高并发就穿透缓存,直接请求DB

解决方案

  • 1.增加互斥锁:在并发的多个请求中,只有第一个请求线程能拿到锁并执行数据库查询操作,其他的线程拿不到锁就阻塞等着,等到第一个线程将数据写入缓存后,直接走缓存,DB数据回写到缓存,后面的请求就不会打到DB,走缓存,从而避免击穿
  • 2.热点数据不过期:要着重考虑刷新的时间间隔和数据异常如何处理的情况
  • 3.布隆过滤器(Bloom Filter),利用高效的数据结构和算法快速判断出这个Key是否在数据库中存在,不存在就返回,存在你就去查了DB刷新KV再返回

穿透

概念

访问一个缓存和数据库都不存在的 key,此时会直接打到数据库上,并且查不到数据,没法回写缓存,所以每次都会打在数据库上,造成数据库压力过大,甚至崩溃

解决方案

  • 1.接口校验:可以在最外层先做一层校验:用户鉴权、数据合法性校验
  • 2.缓存空值:当访问缓存和DB都没有查询到值时,可以将空值写进缓存,但是设置较短的过期时间,该时间需要根据产品业务特性来设置
  • 3.布隆过滤器:使用布隆过滤器存储所有可能访问的 key,不存在的 key 直接被过滤,存在的 key 则再进一步查询缓存和数据库
原文地址:https://www.cnblogs.com/jmtang/p/15022847.html