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

缓冲雪崩

在高并发场景下,大量的缓存key在同一时刻出现大面积的缓存过期,导致大量的请求在缓存中获取不到数据,而直接访问数据库,对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。。

解决方案:

  • 设置Key失效时间点随机,即不同的Key设置不同的过期时间,每一个缓存的过期时间的重复率就会降低,很难引发集体失效的事件
  • 如果缓存数据库采用的是分布式部署,将热点数据均匀分布在不同的缓存数据库中
  • 将热点数据设置为永不过期

缓存穿透

指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。

解决方案:

  • 缓存的key要按一定规则生成,然后集中拦截所有请求缓存的Key,如果请求的Key不满足既定的生成规则,就拒绝访问。
  • 对于NULL值,也直接缓存,但是缓存NULL的时间不能太长,否则NULL数据长时间得不到更新,也不能太短,否则达不到防止缓存击穿的效果
  • 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。

缓存击穿

在高并发情况下,对一个特定的值进行查询,但是这个时候缓存正好过期了,缓存没有命中,而导致大量请求直接访问数据库,如活动系统里面查询活动信息。这种情况就是缓存没有对应的值,数据库有对应的值。

解决方案:

  • 设置热点Key对应的数据永远不过期
  • 读取数据库数据进行缓存时,增加互斥锁

一句话缓存穿透、缓存击穿和缓存雪崩都是缓存失效导致大量请求直接访问数据库而出现的情况。不同的是缓存穿透是数据库和缓存都不存在相关数据;而缓存击穿和缓存雪崩是缓存和数据库都存在相应数据,只是缓存失效了而已。

https://cloud.tencent.com/developer/article/1643910
https://cloud.tencent.com/developer/article/1181615

以上。

原文地址:https://www.cnblogs.com/lovebkj/p/13300082.html