缓存穿透
访问一个不存在的key(查询 userid = -10),缓存不起作用,请求会穿透到DB,流量大时DB会挂掉
解决方案
- 布隆过滤器
- 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截
- 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
缓存击穿
一个存在的key,在缓存过期的那一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增
解决方案
- 分布式锁
- 队列术
- 限流 熔断 降级
- 永不过期
缓存雪崩
在高并发下,大量的缓存key在同一时间失效,导致大量的请求落到数据库上,如活动系统里面同时进行着非常多的活动,但是在某个时间点所有的活动缓存全部过期。
解决方案
- 多级缓存(布隆过滤器+openresty)
- 分布式锁
- 限流(redis+lua)
- 缓存高可用
- 数据预热
Q.E.D.