缓存穿透,缓存击穿,缓存雪崩

缓存穿透,缓存击穿,缓存雪崩

缓存穿透

缓存和数据库中都没有的数据,用户还是可以源源不断的发起请求,导致每次请求都会到数据库,导致数据库被压垮。

image-20210926233747334

查询一个不存在的东西,在redis中查询不到去数据库查询,一直到数据库查询就会造成数据库呗压垮

解决办法:

  1. 业务层校验 用户发过来的请求,我们在代码中进行校验,不存在的不允许访问。

  2. 不存在的数据设置短时间过期

    对于某个空的数据,我们将它空的结果放入redis中缓存,但是设置很短的过期时间,可以根据实际业务设定。但不要影响正常的业务。

  3. 布隆过滤器(最后介绍)

    利用极小的内存来判断大量的数据一定不存在或者可能存在

对于缓存穿透,我们可以将查询的数据条数都哈希到一个足够大的布隆过滤器中,用户发送的请求会先被布隆过滤器拦截,一定不存在的数据就直接拦截返回了,避免了穿透。

缓存击穿

Redis中一个热点key在失效的同时,大量的请求过来,从而会全部到达数据库,压垮数据库。

image-20210926234720214

这里需要注意的是某一个热点key过期失效了,和后面介绍的缓存雪崩有区别。比如iphone13在售卖的时候,缓存在redis中,刚好0点了。这个商品信息在redis中过期查不到了,但是正好大量的用户进入购买,大量请求同时达到数据库,导致数据库被压垮。

解决办法:

  1. 设置热点数据永远不过期

    对于某个需要频繁获取的信息,缓存在redis中,并设置永远不过期,但对于某些业务场景不合适。

  2. 定时更新

    比如我们给一个热点key设置过期时间为1个小时,我们在没到59分钟的时候,定时更新这个热点key

  3. 互斥锁

    简单来说就是在redis中根据key获得value值为空的时候,先锁上,再从数据库加载,加载完就释放锁。若其他线程也在请求该key的时候,就会获取失败,则睡眠一段时间,再重试。

缓存雪崩

Redis中缓存的数据大面积失效,或者Redis宕机了,从而会导致大量请求直接到数据库,压垮数据库。在缓存击穿中是热点key失效导致数据库被压垮

image-20210927000054091

对于一个业务系统,如果Redis宕机或大面积的key同时过期,会导致大量请求同时达到数据库,这是灾难性的问题。

解决办法

  1. 设置有效期均匀分布

    避免缓存设置相近的有效期,我们可以在设置有效时增加随机值,

    或者同一规划有效期,使得过期时间均匀分布

  2. 数据预热

    对于即将到来的大量请求,我们可以提前走一遍系统,将数据提前缓存在redis中,并设置不同的过期时间。

  3. 保证redis服务高可用

    我们可以使用redis的哨兵模式和集群模式,可以防止redis集群单点故障,可以通过这两种模式实现高可用。

image-20210927000907010

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务