。
缓存穿透、击穿、雪崩是怎样产生的呢?比如以下的案例
-
缓存雪崩:假如某一个商品首页的缓存的数据Key失效时间都是10小时,中午10点刷新的,这时秒杀活动大量用户访问这个数据,假设当时每秒 10000 个请求,本来缓存在可以扛住每秒 5000 个请求,但是缓存当时所有的Key都失效了。此时 1 秒 6000 个请求全部落数据库,数据库还没有反应过来可能就直接挂掉了。如果没有解决分案的话,此时重启数据库的话立马又被新的流量给打挂了。这就是缓存雪崩
-
缓存穿透:指缓存和数据库中都没有的数据,当用户不断发起请求访问数据库中不存在的数据时,这时的用户很可能是攻击者,连续请求导致数据库压力过大,严重时会击垮数据库
-
缓存击穿:缓存击穿是指一个Key非常热点,也就是上百万或者上千万的人同时访问这个key的时候,这个key在不停的扛着高并发,高并发集中对这一个key进行访问,当这个Key在失效的瞬间,持续的高并发数据就穿破缓存,直接请求数据库,
缓存穿透、击穿、雪崩解决的分案,比如:
- 缓存雪崩处理方法:在批量往Redis存数据的时候,把每个Key的失效时间加上随机值,这样可以保证数据不会在同一时间大面积失效,如果Redis是集群部署,将热点数据均匀分布在不同的Redis库中也能避免全部失效的问题,或者设置热点数据永远不过期,有更新操作就更新缓存就好了
- 缓存穿透处理:在请求接口方法中增加请求数据的校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码return返回,比如:id 做基础校验,id <=0的直接拦截等
- 缓存击穿处理:设置热点数据永远不过期。或者加上互斥锁
防止缓存穿透也可以使用布隆过滤器实现,原理就是利用高效的数据结构和算法快速判断出这个Key是否在数据库中存在,不存在返回结果就好,存在就去查数据库刷新到redis缓存中再返回客户端