- 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、永不过期..
- 1、即使用分布式锁,解决多线程并发访问问题。
- 4、参考:
- 缓存穿透、缓存击穿、缓存雪崩概念及解决方案 - 简书 https://www.jianshu.com/p/b57d0773ee96
转载于:https://www.cnblogs.com/buwuliao/p/10690381.html