缓存穿透

访问一个不存在的key(查询 userid = -10),缓存不起作用,请求会穿透到DB,流量大时DB会挂掉

解决方案

  1. 布隆过滤器
  2. 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截
  3. 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

缓存击穿

一个存在的key,在缓存过期的那一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增

解决方案

  1. 分布式锁
  2. 队列术
  3. 限流 熔断 降级
  4. 永不过期

缓存雪崩

在高并发下,大量的缓存key在同一时间失效,导致大量的请求落到数据库上,如活动系统里面同时进行着非常多的活动,但是在某个时间点所有的活动缓存全部过期。

解决方案

  1. 多级缓存(布隆过滤器+openresty)
  2. 分布式锁
  3. 限流(redis+lua)
  4. 缓存高可用
  5. 数据预热

Q.E.D.