十二、Redis缓存穿透、击穿、雪崩
上述三类问题都是服务的三高问题
- 高并发
- 高可用
- 高性能
面试高频,工作常用
redis缓存的使用极大提升了应用程序的性能和效率,特别是数据查询方面,但同时,它也带来了一些问题,例如数据一致性问题,严格意义上讲,问题无解,对一致性要求极高的话,不建议使用缓存
1.缓存穿透
缓存穿透的概念:用户查询一个数据,redis数据库中没有,也就是缓存没有名字,于是向持久层数据库查询,发现也没有,于是查询失败,用户很多的时候,缓存都没有命中,都要请求持久层数据库,会给持久层数据库造成巨大的压力,称之为缓存穿透。
解决方案: 在直达持久层的路径上添加过滤器或者在缓存中专门增加一个为空的请求。
布隆过滤器
布隆过滤器是一种数据结构,对所有可能的查询参数以hash形式存储,在控制层进行校验,不符合则丢弃,从而避免了对底层存储系统查询的压力
缓存空对象
一次请求若在缓存和数据库中都没有找到,就在缓存中放一个空对象用于处理后续这个请求
- 存储空的key也需要空间
- 对空值设置了过期时间,还是会存在缓存层和存储层的数据有一段时间窗口不一致,对于需要保持一致性的业务会有影响
2.缓存击穿(量太大,缓存过期)
概念:相对于缓存穿透,缓存击穿的目的性更强,一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。这就是缓存被击穿,只是针对其中某个key的缓存不可用而导致击穿,但是其他的key依然可以使用缓存响应。
解决方案:
-
设置热点数据永不过期
这样就不会出现热点数据过期的情况,但是当Redis内存空间满的时候也会清理部分数据,而且此种方案会占用空间,一旦热点数据多了起来,就会一直占用那部分空间。
-
加互斥锁(分布式锁)
在访问key之前,采用SETNX(set if not exists)来设置另一个短期的key来锁住当前key的访问,访问结束再删除该短期key。保证同时刻只有一个线程访问,这样对锁的要求就十分高
3.缓存雪崩
概念:大量的key设置了相同的过期时间,导致缓存在同一时刻全部失效,造成瞬间DB请求量大、压力骤增,引起雪崩。
- redis高可用
这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群 - 限流降级
这个思想的含义是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。 - 数据预热
数据加热的含义就是在正式部署之前,我先把可能的数据先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
参考:https://blog.csdn.net/weixin_43873227/article/details/106107270
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81912.html