Redis缓存穿透、击穿、雪崩及解决方案

  • 缓存穿透:缓存中查不到,数据库中也查不到。(例如黑客发送大量不存在的id去查询商品)
    • 解决方案:
      • 对参数进行合法性校验
      • 将数据库中没有查到结果的数据也写入到缓存。这时要防止Redis被无用的Key占满,这一类缓存的有效期要设置短一点
      • 使用布隆过滤器,在访问Redis之前判断数据是否存在
  • 缓存击穿:缓存中没有,数据库中有。一般是出现在缓存数据初始化或者Key过期了的情况下。它的问题在于,重新写入缓存需要一定的时间,如果是在高并发的场景下,过多的请求就会瞬间写到数据库上,给数据库造成很大的压力
    • 解决方案:
      • 设置这个热点缓存永不过期,这时要注意在value当中包含一个逻辑上的过期时间,然后另起一个线程,定期重建这些缓存
      • 加载数据库的时候,要防止并发(加上互斥锁)
  • 缓存雪崩:缓存大面积过期,导致请求都被转发到数据库
    • 解决方案:
      • 设置缓存过期时间时,不要用统一失效时间,可以在原来的基础上设计一个随机值
      • 对热点数据设置永不过期

你可能感兴趣的:(缓存,redis,数据库)