缓存穿透、缓存击穿、缓存雪崩,以及怎么解决?

什么是缓存穿透?

  1. 缓存穿透:缓存中查不到,数据库中也查不到。
  2. 解决方案:
  • 对参数进行合法性校验
  • 将数据库中没有查到结果的数据也写入到缓存。这时要注意为了防止Redis被无用的key占满,这一类缓存的有效期要设置得短一点。
  • 引入布隆过滤器(BloomFilter),在访问Redis之前判断数据是否存在。要注意布隆过滤器存在一定的误判率(BloomFilter判断不在集合中则一定不在集合中,BloomFilter判断在集合中则可能不在集合中),并且布隆过滤器只能加数据不能减数据。

什么是缓存击穿?

  1. 缓存击穿:缓存中没有,数据库中有。一般是出现在存储数据初始化以及key过期了的情况。他的问题在于,重新写入缓存,需要一定的时间,如果是在高并发场景下,过多的请求就会瞬间写到DB上,给DB造成很大的压力。
  2. 解决方案:
  • 设置这些热点缓存永不过期。这时要注意在value当中包含一个逻辑上的过期时间,然后另起一个线程,定期重建这些缓存。
  • 加载DB的时候,要防止并发(加锁处理)。

什么是缓存雪崩?

  1. 缓存雪崩:缓存大面积过期,导致请求都被转发到DB。
  2. 解决方案:
  • 把缓存的失效时间分散开。例如,在原有的统一失效时间基础上,增加一个随机值。
  • 对热点数据设置永不过期。
原文地址:https://www.cnblogs.com/pangqianjin/p/14616754.html