缓存穿透、缓存击穿、缓存雪崩概念及解决方案
- 一、缓存穿透(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 中。
- 三、永不过时..
- 四、参考:
欢迎关注本站公众号,获取更多信息