- 缓存雪崩
- 缓存穿透
- 缓存击穿
首先得先明确redis是个中间件的缓存,也就是把经常访问的数据从数据库放到redis中,一方面减少数据库的压力,一方面也加快数据检索,但如果redis因为不可抗拒因素失效的话,请求就会大量冲击数据库,这就是这篇文章要说的缓存雪崩,穿透,击穿
缓存雪崩
是指大片的redis数据失效之后,大量的数据在redis请求不到,就会全部打向数据库,有可能造成数据库崩溃。比如这样的场景,我的博客页面首页会出现我写的一部分文章,如果这些文章的连接和图片我存在redis中,并且首页文章是会按时推送不同的内容,突然数据的过期时间到了,刚好突然有一群人要看我的bolg(如果真有就好了),这时候大量的请求就会直接打向数据库
有什么解决方法呢,有两个比较好的方法,就是对每个数据我都设置一个随机的过期时间,这个随机过期时间有可能是十分钟之长,这样那一瞬间并不会同时有所有 key 都失效,请求自然也就不会全部打到数据库。
方法二就是不删除旧数据,既然数据这么重要,就不要让它自动失效。等一天结束了,我再手动删除这个缓存就行,我会提前存入新的数据,在要替换的哪一个时候新数据就可以直接生效了(提前存是因为数据存进去有个时间,刚好替换的时候存来不及)
缓存击穿
是指redis的一个热点数据突然失效了,所有的请求全部打向数据库,就像一道很细的激光,可能是因为没设置好过期时间,也可能是因为误删数据(man,误删数据被知道就完蛋咯)
缓存穿透
是指请求redis中和数据库中都不存在的数据,而且这个请求还在频繁的发送,就像平常有人一直问你一些让你很无语的问题,给你问烦了,你就被穿透了
这个时候需要我们后端及时return不合理数据,当然也可以依靠redis的布隆过滤器(站在布隆后面)
保持redis的高可用
保证高可用是什么意思,既然你使用了redis,你就得物尽其用,假如你的redis挂掉了,那数据库就得独自面对压力了。
可以通过“主从+哨兵”模式管理,主从是意思是一个主redis和一个从影子redis,然后哨兵监视主redis,如果主redis挂掉了,哨兵就安排从redis顶上。还有一个是集群模式,就是有很多的redis,每个redis负责不同的数据,这样所有的请求就不会打到同一个redis身上了。同时还要做好熔断处理,流量降级(蓝桥杯的app在出成绩的时候就是没做好流量降级,数据库被打炸了,结果还是要等到老时间才能查询成绩)









