缓存雪崩、击穿、穿透都是指应用服务跳过缓存层直接访问数据库,给数据库带来了压力,甚至会给数据库带来宕机的风险。不同之处在与是由哪种情况导致的跳过缓存。

雪崩

指大量的请求不能由缓存处理导致(不同的key)。

  • 情况一,当缓存中大量的key同一时间过期导致。
  • 处理方式,均匀的分配过期时间。
  • 情况二,缓存服务器宕机。
  • 这个与应用服务处理的策略有关系。
  • 如果缓存服务器宕机后允许穿透到数据库进行处理,为了提高服务的可用性,此时有可能会导致数据库雪崩。
  • 如果缓存服务宕机后不允许穿透到数据库进行处理,也就不会出现雪崩的情况,数据库安全,服务不可用。实际情况下还是需要进行权衡。

击穿

针对的的是热点key的问题,当一个热点key在过期时,同时并发量较高时,会有多个应用节点同时去查询数据库,更新缓存。导致数据库并发较高。

  • 方案一,设置缓存key永久不过期,主动去更新。
  • 方案二,更新时增加分布式锁,只有一个请求去更新缓存的值。

穿透

当应用服务被黑客攻击或者用户访问的数据缓存和数据库中都不存在时,每次都需要请求数据库来进行判断。此时会有大量的请求跳过缓存直接查询数据库。

  • 方案一:针对不存在的key在缓存中存储默认值。缺点会占用大量的存储。
  • 方案二:在请求入口处增加布隆过滤器,布隆过滤器可以确定哪些key一定不存在。

总结

综上所述,还可以在数据库前增加限流处理,以此来保证不会有大量的请求会同时到达数据库。