Redis的击穿、雪崩、穿透

一、缓存击穿

前言:redis主要的作用就是数据库的挡箭牌,减轻数据库的压力。

1、击穿是什么?

某一件商品突然之间变成了爆款,之前此商品一直是冷门,冷门商品一般会设置key的过期时间;当然突然的爆火是始料不及的是不可预测的,在这个时间突然就扛着这么大的一个并发量,这个key刚好就失效了,这个并发量就会击穿redis来到数据库;当然会渐接对我们数据库造成非常大的压力;后续还会将数据库查询到的数据,(里面有很多的线程)给他存到redis中这样就造成了性能的浪费。

如图:

2、解决方法?

1、给这些数据设置为永不过期;当然把所有的商品都设置为永不过期redis的储存空间是不够的;

2、我们可以把一些能够想像到的爆款商品设置为永不过期,把一些冷门商品设置为定定时过期,但是突然变成爆款的商品我们是始料不及的;

3、这个时候可以写一个方法,它的访问量突然增加到某个数量,就会给他修改时间为永不过期;

4、加同步锁解决,让线程进行排队一个一个进来,先放一个线程进来数据库查数据,查到数据并放到redis中后面排队的线程才能进来,在去redis查就能查到了。

二、缓存雪崩

1、缓存雪崩是什么?

1.缓存雪崩是redis里面的key集中过期了,假如我的系统并发量很高,这些请求会直接击穿redis全部打到MySQL,这样我的MySQL就有可能会挂掉,数据库挂掉了可能导致我的整个应用就不能用,从而就导致我整个系统雪崩了,这就是所谓的缓存雪崩;

2.服务器挂掉了,redis里面缓存就都不行了,直接打到MySQL里面,这两种情况都会导致系统雪崩,进而导致系统雪崩。

图例:

2、解决方法?

1.加上一个随机的失效时间不让他集中失效;

2.提前做好集群,做好哨兵模式,挂掉了另一个补上就解决了;

三、缓存穿透

1、缓存穿透是什么?

请求的数据redis里面没有,然后请求MySQL里面也没有,这个时候少量没问题,如果说突然大量的请求redis和mysql里面都没有这时候有;可能是遭到了用户的恶意攻击,它会去请求一些没有的id或负数特别大的id伪造大量请求去攻击应用,系统可能就支撑不住然后挂掉此上就是缓存穿透。

2、解决方法?

1.参数校验,一些负数或无效阐述给过滤掉,但是杜绝不了一些特别大的id;

2.缓存空对象,将数据库查到的数据不管有没有返回的数据都存到redis里面然后设置一个随机失效的时间;

3.使用布隆过滤器。

更新中~

未完待续~

个人笔记,如有错误还请指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值