Redis 雪崩、击穿、穿透分析

首先了解一下概念然后逐个讲解。

雪崩:雪崩的场景大家在很多电影中其实都看到过,就是大面积的雪全部坍塌。
           放在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模式做到数据快速恢复。
         

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Redis雪崩击穿穿透是与Redis缓存相关的常见问题。 1. 雪崩:当Redis中的大量缓存同时失效或被清空,导致所有请求都直接落到数据库上,给数据库造成巨大压力,甚至导致宕机的情况。为了避免雪崩,可以采取以下措施: - 设置合理的缓存过期时间,避免大量缓存同时过期。 - 使用分布式锁来保证只有一个线程去更新缓存,其他线程等待缓存更新完成后再读取。 - 引入热点数据预加载策略,提前加载热门数据,减少缓存失效的影响。 2. 击穿:指某个热点数据的缓存过期后,恰好有大量请求同时访问该数据,导致所有请求都直接落到数据库上,给数据库造成压力。为了避免击穿,可以采取以下措施: - 使用互斥锁或分布式锁来保证只有一个线程去查询数据库并更新缓存,其他线程等待缓存更新完成后再读取。 - 在查询数据库前,先判断缓存是否存在,如果不存在则进行加锁查询数据库并更新缓存。 3. 穿透:指查询一个不存在的数据,由于缓存未命中,每次请求都会直接访问数据库,造成数据库压力过大。为了避免穿透,可以采取以下措施: - 对于查询结果为空的情况,也将空对象缓存起来,设置较短的过期时间,避免频繁查询数据库。 - 对于恶意请求或无效请求,可以进行参数校验或限流等处理。 以上是对Redis雪崩击穿穿透的一些常见解决方案,具体的应对策略需要根据实际场景进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术分子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值