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

  • 1、缓存穿透(KEY不存在,可以理解为每次都穿透)
    • 访问一个不存在的 key,缓存不起作用,请求会穿透到 DB,流量大时 DB 会挂掉。
    • 解决:
      • 1、采用布隆过滤器,使用一个足够大的 bitmap,用于存储可能访问的 key,不存在的 key 直接被过滤;
      • 2、访问 key 未在 DB 查询到值,也将空值写进缓存,但可以设置较短过期时间。
  • 2、缓存雪崩(大量KEY同时过期)
    • 大量的 key 设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时 DB 请求量大、压力骤增,引起雪崩。
    • 解决方案
      • 可以给缓存设置过期时间时加上一个随机值时间,使得每个 key 的过期时间分布开来,不会集中在同一时刻失效。
  • 3、缓存击穿(一个过期Key被并发访问。可以这么理解:多个请求,所以是击穿)
    • 一个存在的 key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到 DB,造成瞬时 DB 请求量大、压力骤增。
    • 解决方案
      • 1、即使用分布式锁,解决多线程并发访问问题。
        • 在访问 key 之前,采用 SETNX(set if not exists)来设置另一个短期 key 来锁住当前 key 的访问,访问结束再删除该短期 key。
      • 2、提前使用分布式锁:
        • 在 value 内部设置 1 个超时值 (timeout1), timeout1 比实际的 memcache timeout (timeout2) 小。当从 cache 读取到 timeout1 发现它已经过期时候,马上延长 timeout1 并重新设置到 cache。然后再从数据库加载数据并设置到 cache 中。
      • 3、永不过期..
  • 4、参考:
posted @ 2019-04-11 16:11  不无聊  阅读(310)  评论(0编辑  收藏  举报