美文网首页
redis缓存穿透、缓存击穿和雪崩

redis缓存穿透、缓存击穿和雪崩

作者: 小名源治 | 来源:发表于2022-10-19 08:12 被阅读0次

    缓存穿透(找不到)

    概念

    在默认情况下,用户请求数据时,会先在缓存(Redis)中查找,若没找到即缓存未命中,再在数据库中进行查找,数量少可能问题不大,可是一旦大量的请求数据(例如秒杀场景)缓存都没有命中的话,就会全部转移到数据库上,造成数据库极大的压力,就有可能导致数据库崩溃。网络安全中也有人恶意使用这种手段进行攻击被称为洪水攻击。

    解决办法

    • 缓存空值:当请求的数据不存在 Redis 也不存在数据库的时候,设置一个缺省值(比如:None)。当后续再次进行查询则直接返回空值或者缺省值。
      这样做有一个缺陷:存储空对象也需要空间,大量的空对象会耗费一定的空间,存储效率并不高。解决这个缺陷的方式就是设置较短过期时间
      即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。
    • 布隆过滤器:在数据写入redis数据库的同时将这个 ID 同步到到布隆过滤器中(放到一个Hash表中,方便快速找到),当请求的 id 不存在布隆过滤器中则说明该请求查询的数据一定没有在redis缓存中保存,就不要去数据库查询了。
      image.png

    缓存击穿(单点访问量太大,缓存击穿)

    概念

    缓存击穿的意思是,当一个存在的key,它正常存在时被高频访问没关系。但是在它的缓存过期的那一时刻,很多请求来访问就会击穿缓存访问到数据库,造成数据库顿时压力增加。只是针对其中某个key的缓存不可用而导致击穿,但是其他的key依然可以使用缓存响应。
    例如:微博热搜榜的某个热搜的缓存突然失效了,它就会造成缓存击穿。

    解决方案

    • 设置热点数据永不过期
      这样就不会出现热点数据过期的情况,但是当Redis内存空间满的时候也会清理部分数据,而且此种方案会占用空间,一旦热点数据多了起来,就会占用部分空间。

    • 加互斥锁(分布式锁)
      在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。保证同时刻只有一个线程访问。这样对锁的要求就十分高。

    缓存雪崩

    概念

    导致在缓存在同一时刻全部失效,所有的请求都到数据库中访问,造成瞬时数据库请求量大、压力骤增,引起雪崩。
    出现该状况有两个原因:

    • 大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效
    • Redis 故障宕机,缓存系统异常。

    解决方案

    • 过期时间添加随机值(解决缓存在同一时刻全部失效)
      要避免给大量的数据设置一样的过期时间,过期时间 = baes 时间+ 随机时间(较小的随机数,比如随机增加 1~5 分钟)。
      这样一来,就不会导致同一时刻热点数据全部失效,同时过期时间差别也不会太大,既保证了相近时间失效,又能满足业务需求。

    • 接口限流
      限流,就是指,我们在业务系统的请求入口前端控制每秒进入系统的请求数,避免过多的请求被发送到数据库。
      当访问的不是核心数据的时候,在查询的方法上加上接口限流保护。比如设置 10000 req/s。
      如果访问的是核心数据接口,缓存不存在允许从数据库中查询并设置到缓存中。
      这样的话,只有部分请求会发送到数据库,减少了压力。

    • redis高可用(解决宕机)
      这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群

    参考文章:文章一
    参考文章:文章二

    相关文章

      网友评论

          本文标题:redis缓存穿透、缓存击穿和雪崩

          本文链接:https://www.haomeiwen.com/subject/lhnezrtx.html