缓存雪崩
定义:
同一时间所有 key 大面积失效,比如网站首页的数据基本上都是同一批次去缓存的。
解决方法:
① 存的时候设定随机的失效时间。
② 服务做熔断处理(异常或着慢查询 Hystrix 限流+降级)
缓存穿透
定义:
缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。
解决方法:
① 在接口层增加校验,比如用户鉴权校验,参数校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等。
② 从缓存取不到的数据,在数据库中也没有取到,这时也可以将对应Key的Value对写为null、位置错误、稍后重试这样的值。缓存有效时间可以设置短点,如30秒
③ 网关层 Nginx 可以对单个IP每秒访问次数超出阈值的IP都拉黑。
④ Redis还有一个高级用法布隆过滤器(Bloom Filter)这个也能很好的防止缓存穿透的发生,它的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。
缓存击穿
定义:
指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。
解决方法:
① 设置热点数据永远不过期。
② 加互斥锁(比如表单重复提交,可以限制每条数据同时只能访问一次)