Redis的缓存穿透、击穿、 雪崩出现的原因及解决方案

redis 常见缓存问题,因为缓存雪崩和穿透,要么不出现,要么出现就致命问题,所以这也是常见面试题。

缓存穿透

什么是缓存穿透:

在一个系统中,突然有几千个请求同时进来,缓存中查询不到,数据库也查询不到。这种恶意请求可能一下子就把数据库给打死了。(就好像没有缓存一般)。

解决方案

将查询出来的空值也存入redis当中,设置一个过期时间,在该时间段无论多少次请求都不会进入数据库。

缓存击穿

什么是缓存击穿

有一个热点数据,当前访问量非常大,突然热点数据失效了,同时几千个请求访问数据库,一瞬间数据库死掉。(缓存突然开了一个洞,请求全进去了)

解决方案

不同的场景下解决方案不同:

  • 缓存的数据用不更新,可以设置为永不过期
  • 缓存数据更新不频繁,可以采用互斥锁(redis的SETNX等),使其少量请求进入访问,其他的请求等进入的请求写入缓存后,直接访问缓存
  • 缓存频繁更新,可以利用定时任务在缓存过期前主动更新一下,或延迟过期时间,保证请求能一直找到对应的请求。

缓存雪崩

什么是缓存雪崩

当某一时刻,大量的缓存同时失效,或者缓存宕机了,随后所有的请求进入数据库,数据库扛不住死掉了。

解决方案

  • 事前:使用集群,高可用,主从+哨兵
  • 事中:ehcache+Hystrix限流&降级,避免MySQL被打死
  • 事后:服务器一重启马上恢复持久化数据
  • 其他方法:给这些数据设置不同的过期时间,不至于一瞬间请求全部涌入数据库。

总结

以上就是redis缓存的常见问题,以及解决方案。
其实上面的问题都在解决一个问题。避免请求一下子的把数据库给弄死。
当然项目中需要根据自己的实际架构和业务情况进行选择解决。

你可能感兴趣的:(Redis的缓存穿透、击穿、 雪崩出现的原因及解决方案)