首先了解一下概念然后逐个讲解。
雪崩:雪崩的场景大家在很多电影中其实都看到过,就是大面积的雪全部坍塌。
放在Redis中就是大量的缓存key全部失效了。
脑海中立刻提出疑问将key全部改为永不失效是不是就避免了雪崩 ?
答案是可以。我们都知道内存是非常宝贵的这样会让我们付出昂贵代价。
通过分析上述方案不是一个好的解决方案。
要想找出一个比较好的解决方案,我们就必须知道雪崩后的后果是什么。
如果发生雪崩后,会有什么影响呢?
雪崩发生后大量查询缓存数据的请求,将会全部请求到数据库有可能造成数据库宕机。
(数据宕机的风险肯定要降到最低,否则可能会影响整个系统)
接下来我们分析一下使用有效期缓存的场景有哪些呢?
大致分为几类?
1.需要定时更新缓存。例如:缓存一个小时自动失效重新将数据库数据进行缓存。
2.对数据在某一个时间段内需要做幂等处理的。例如接口防刷拦截。1分钟相同订单最多查询100次。
3.需要对数据做预热处理的。
影响和使用场景我们已经清楚了,我们有没有什么比较好的方案呢?答案肯定是有的。
根据场景的不同我们可以做不同的处理方式
场景1类型:可以将不同的缓存key有效期进行离散处理,这样做的好处缓存key不会大面积失效。
场景2类型:可以添加分布式限流和单机限流策略,使得访问数据可QPS可控。
场景3类型:可以采用异步更新缓存策略。
击穿:击穿的场景大家可以想象一个盾牌被坚硬的矛戳出一个窟窿。
放在Redis中就是一个访问特别大的缓存key突然失效。(热点key失效)
如果发生击穿后,会有什么影响呢?
击穿发生后大量查询热点缓存key数据的请求,将会全部请求到数据库有可能造成数据库宕机。
(数据宕机的风险肯定要降到最低,否则可能会影响整个系统)
场景例如热销商品、秒杀产品等等。
解决方案:通过分布式锁或者限流策略亦或异步更新缓存方式更新缓存。
穿透:穿透的场景好比从指缝中的流沙。
放在Redis中就是不存在缓存key并且数据库中也不存在。
如果发生穿透后,会有什么影响呢?
穿透发生后会有大量无效请求浪费服务器资源(IO连接数),甚至还有可能导致数据库宕机。
(数据宕机的风险肯定要降到最低,否则可能会影响整个系统)
场景例如来自黑客攻击根据一些无效的订单号进行查询。
解决方案:首先要对查询数据请求参数添加规则校验、其次要对无效查询结果进行有限缓存
(比如用户PIN或IP添加一定时间的黑名单处理)。
如果量非常大可以采用布隆过滤器策略防止请求到数据库,并且添加黑名单处理。
注:对于极端场景Redis宕机问题,可以考虑主从+哨兵模式、Redis cluster、分布式和单机限流、本地缓存、降级方案处理。
如果Redis不幸的发生后建议使用RDB+AOF模式做到数据快速恢复。