缓存雪崩、缓存穿透、缓存击穿概念及解决方案
个人理解:
我们先了解一下雪崩、穿透、击穿这几个单词的含义呗。
雪崩:当山坡积雪内部的内聚力抗拒不了它所受到的重力拉引时,便向下滑动,引起大量雪体崩塌,人们把这种自然现象称作雪崩。
穿透:以前玩CS、CF时有种外挂就是透视挂,可以直接无视墙看到你人在哪里。
击穿:字面意思咯,开枪击穿了墙,打到你人的身体上;那这个墙就被击穿了。
缓存雪崩:缓存大部分失效或缓存宕机,导致请求到达了数据库,数据库扛不住压力挂了,导致服务也跟着挂。因缓存引起的服务崩塌。
缓存穿透:数据不存在,请求绕过了缓存或者根本不在缓存里,直接去查询数据库。
缓存击穿:热点缓存失效,请求到了数据库。
区别:缓存雪崩是大部分的key失效,击穿是说热点key失效,穿透是key不存在缓存和数据库中
缓存雪崩
缓存大部分失效或缓存宕机,导致请求到达了数据库,数据库扛不住压力挂了,导致服务也跟着挂。因缓存引起的服务崩塌。
造成原因
大部分key失效、热点数据失效、缓存服务宕机不可用
解决方案
- 宕机的话可以,建立集群,提高可用性
- 数据失效的话,可以用多级缓存,本地进程作为一级缓存,redis作为二级缓存,不同级别的缓存设置的超时时间不同,即使某级缓存过期了,也有其他级别缓存兜底
- 缓存过期时间设置随机数,不要让数据再同个时间段一起失效
缓存穿透
查询一个根本不存在的数据,缓存层、持久层都不会命中。
造成原因
攻击者,经常查询一些不会存在的数据, 比如查询商品id= -1
解决方案
- 接口层做校验,id<0 返回错误
- 使用布隆过滤器
- 非法请求多次的ip进行拉黑
缓存击穿
热点缓存失效,请求到了数据库。
造成原因
- 当前key是一个热点key(例如一个秒杀活动),并发量非常大。
- 重建缓存不能在短时间完成,可能是一个复杂计算,例如复杂的SQL、多次IO、多个依赖等。
解决方案
- 缓存过期时间设置永不过期
参考:https://blog.csdn.net/womenyiqilalala/article/details/105205532