Redis 缓存雪崩 、击穿、穿透问题和解决方案

缓存雪崩

什么是缓存雪崩,缓存雪崩即内存的中缓存,无法正常读取出来,大量请求访问到数据库上,导致数据库内存飙升,压力过大,严重甚至导致数据库岩机,导致项目整体挂了

之前自己公司线上服务就有遇到过服务雪崩,大面积缓存数据失效导致的,请求访问到了数据库,导致数据库内存飙升,服务变得卡顿,最后排查原因,发现是我们定时任务服务,线程堵塞了,所有定时任务都不执行,无法从数据库读后写入Redis

在这里插入图片描述

发生缓存雪崩的几种情况
1:redis异常导致岩机
2:大面积缓存失效
3:请求超出redis最大承受数

解决方案
1:给redis做集群,读写分离+哨兵模式,提高Redis高可用
2:使用锁,队列来限制访问,还可以使用组件hystrix可以对压力过大的接口,降级和熔断
3:防止同一时间大面积缓存失效,可以对每个缓存失效时间设置不一样,这样最多同时小部分缓存失效

在防止缓存雪崩切记,一定要保证数据库不要岩机,数据库没挂,项目还在正常运行,数据库挂了,项目就挂了

缓存穿透
对于系统A,假设一秒 5000 个请求,结果其中 4000 个请求是黑客发出的恶意攻击。

黑客发出的那 4000 个攻击,缓存中查不到,每次你去数据库里查,也查不到。

举个例子。数据库 id 是从 1 开始的,结果黑客发过来的请求 id 全部都是负数。这样的话,缓存中不会有,请求每次都“视缓存于无物”,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。
在这里插入图片描述

解决方案
解决方式很简单,每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN。然后设置一个过期时间,这样的话,下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓存中取数据。

缓存击穿
什么是缓存击穿,热点接口的key缓存失效间隙,大量请求访问到了数据库上,从而没有使用到缓存

缓存击穿原因和解决方案

1:缓存key失效,定时任务还没执行
key的失效时间可以设置长一点,还可以在接口代码中添加判断缓存中没有,查询数据库在存入缓存中

2:数据库没有数据,从而缓存也没数据
数据库没有数据,缓存存入一个特定的value,通过判断解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值