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

  • 一、缓存穿透(KEY不存在,能够理解为每次都穿透)
    • 访问一个不存在的 key,缓存不起做用,请求会穿透到 DB,流量大时 DB 会挂掉。
    • 解决:
      • 一、采用布隆过滤器,使用一个足够大的 bitmap,用于存储可能访问的 key,不存在的 key 直接被过滤;
      • 二、访问 key 未在 DB 查询到值,也将空值写进缓存,但能够设置较短过时时间。
  • 二、缓存雪崩(大量KEY同时过时)
    • 大量的 key 设置了相同的过时时间,致使在缓存在同一时刻所有失效,形成瞬时 DB 请求量大、压力骤增,引发雪崩。
    • 解决方案
      • 能够给缓存设置过时时间时加上一个随机值时间,使得每一个 key 的过时时间分布开来,不会集中在同一时刻失效。
  • 三、缓存击穿(一个过时Key被并发访问。能够这么理解:多个请求,因此是击穿)
    • 一个存在的 key,在缓存过时的一刻,同时有大量的请求,这些请求都会击穿到 DB,形成瞬时 DB 请求量大、压力骤增。
    • 解决方案
      • 一、即便用分布式锁,解决多线程并发访问问题。
        • 在访问 key 以前,采用 SETNX(set if not exists)来设置另外一个短时间 key 来锁住当前 key 的访问,访问结束再删除该短时间 key。
      • 二、提早使用分布式锁:
        • 在 value 内部设置 1 个超时值 (timeout1), timeout1 比实际的 memcache timeout (timeout2) 小。当从 cache 读取到 timeout1 发现它已通过期时候,立刻延长 timeout1 并从新设置到 cache。而后再从数据库加载数据并设置到 cache 中。
      • 三、永不过时..
  • 四、参考:
相关文章
相关标签/搜索