Skip to content

缓存穿透、缓存击穿、缓存雪崩

缓存雪崩

概念

  • 缓存雪崩 是指缓存服务器宕机或因为意外崩溃导致所有的请求全部直接到达数据库,导致数据库报警,最终导致数据库因为承载量过大崩溃。

解决方案

  • 事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
  • 事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
  • 事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

走缓存的业务流程 :当接收到请求时,先从缓存中查询(Redis、ehcache等),如果缓存中没有,再从数据库中查询(MySQL、Oracle等),再将查询的结果存入到缓存中,下次请求进入时会先从缓存中给查询,此时就不会从数据库中查询。

限流的好处

  • 数据库不会挂,因为限流组件确保了每秒之后规定的请求数量可以通过,这个数值可以根据服务的QPS等综合评定。
  • 只要数据库不死,就是说,对用户来说,有一定的请求都是可以被处理的。
  • 只要有一定的请求可以被处理,就意味着你的系统没死,对用户来说,可能就是点击几次刷不出来页面,但是多点几次,就可以刷出来一次。

缓存穿透

概念

  • 缓存穿透 是指每次请求都从缓存中查询不到,导致每次请求都会去数据库中查询。

解决方案

  • 当请求从数据库中没查询到数据时,就往缓存中写一条对业务无用但是对缓存可用的值(null等),并设置过期时间,这样下次有相同的key去缓存中查询时,只要在过期时间之前,就会从缓存中读取,避免了再次查询数据库。

缓存击穿

概念

  • 缓存击穿 是指某个热点key再失效的瞬间有大量请求进入,导致在数据还未再次写入缓存前请求直接到达数据库。

解决方案

  • 设置热点数据永不过期,采用动态更新的方式同步热点数据。
  • 采用锁,当有请求在将数据写入缓存中时,让其他请求等待或降级,等待请求将数据写入到缓存中时释放锁,放行其他请求。