缓存的穿透、击穿、雪崩

缓存穿透

正常业务下,一个请求查询到数据后,我们可以将这个数据保存在Redis

之后的请求都可以直接从Redis查询,就不需要再连接数据库了

如果一个请求查询的数据,数据库中没有会发生什么事情?

它会先查询Redis,Redis没有会查询数据库,数据库也没有这就是缓存穿透

因为数据库中没有数据,所以Redis也无法保存数据,如果这个请求反复出现,就会反复连接数据库,严重的导致数据库性能降低甚至宕机

解决方案:业界主流解决方案:布隆过滤器

布隆过滤器的使用步骤

  1. 针对现有所有数据,生成布隆过滤器

  2. 在业务逻辑层,判断Redis之前先检查这个id是否在布隆过滤器中

  3. 如果布隆过滤器判断这个id不存在,直接返回

  4. 如果布隆过滤器判断id存在,在进行后面业务执行

缓存击穿

一个计划在Redis保存的数据,业务查询,查询到的数据Redis中没有,但是数据库中有

这种情况要从数据库中查询后再保存到Redis,这就是缓存击穿

但是这个情况也不是异常情况,因为我们大多数数据都需要设置过期时间,而过期时间到时,这些数据一定会从数据库中再次同步

缓存雪崩

上面讲到击穿现象,同一时间发生少量击穿是正常的。

若同时大量缓存失效,例如百分之80的缓存都在5000毫秒后过期导致请求都压在mysql上,mysql承担不了,非常可能导致异常

要想避免这种情况,就需要避免大量缓存同时失效

大量缓存同时失效的原因:通常是同时加载的数据设置了相同的有效期导致的

那么我们需要在设置有效期时添加一个随机数,大量数据就不会同时失效了,

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MrJianD

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

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

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

打赏作者

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

抵扣说明:

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

余额充值