一、缓存击穿
前言: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.使用布隆过滤器。
更新中~
未完待续~
个人笔记,如有错误还请指正。