zoukankan      html  css  js  c++  java
  • 缓存穿透、缓存击穿、缓存雪崩概念及解决方案

    • 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、参考:
  • 相关阅读:
    HDU 2955 Robberies
    HDU 2546 饭卡
    poj 3628 Bookshelf 2
    poj 3624 Charm Bracelet
    celery -1
    ☀【Grunt】插件
    【MooTools】
    【Grunt】
    ↗☻【PHP与MySQL程序设计 #BOOK#】第3章 PHP基础
    【CSS】
  • 原文地址:https://www.cnblogs.com/buwuliao/p/10690381.html
Copyright © 2011-2022 走看看