缓存之穿透、击穿、雪崩及其解决方法

6 篇文章 1 订阅

现代软件开发中,我们必不可少的中间件必定是缓存,也是我们无法避开的一个知识点。今天我们来展开聊一下在开发中对于缓存经常会遇到的三个问题,也是在面试题中经常会被问到的高频知识点!也就是缓存穿透、缓存击穿、缓存雪崩的知识以及其相对应的解决方案!

什么是缓存穿透

缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。

假如有人去使用不存在的key对我们进行高频攻击,就会出现我们数据库的压力暴增,从而导致崩溃,这就是缓存穿透现象。

解决方案

1、对url中的key值, id值进行对称加密,使得不轻易的暴露出真实的key值,防止黑客攻击

2、无论数据实际上存不存在,我们都会把这个键存到缓存中(有效期设置的短一些,比如一分钟到三分钟),然后值设置为一个特定值,业务中如果获取到的结果是这个特定值,则返回特定内容或者报错返回。

3、在业务请求时,对数据进行合法性的校验,检查其请求参数是否合理、是否恶意请求、是否含有非法值,对非法请求提前进行拦截。比如我们查询年龄时候,他请求的是负数,则判定为非法请求。

4、进行写数据时,使用布隆过滤器进行打标处理(也就是设置白名单了),当发现缓存中没有对应数据时,可通过查询我们的不漏过滤器来判断数据是否是白名单内数据,如果不在是,则直接返回null或者失败

5、当有异常情况发生时,对方问的对象和数据进行实时监控,然后分析用户的行为是否为恶意请求、攻击或者可恶的爬虫,对其进行特有的用户行为限制,

什么是缓存击穿

缓存击穿:指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求转移到了数据库侧。

解决方案

1、最简单的方式就是不设置热点数据的过期时间,后台操作的时候对缓存进行异步更新操作,比较适用于对缓存一致性要求不严格的场景

2、使用我们的互斥锁(Mutex key),也就是仅仅有一个线程构建缓存,另外的线程等待构建缓存完成后,再从缓存中拿到缓存之后的数据,如果是单机程序,则可以通过lock或者是synchronized来进行处理,如果是分布式环境则需要采用分布式锁来处理。

3、比较猥琐的方式,就是提前进行互斥锁的使用,在value数据的内部设置一个比缓存过期时间更短的过期时间标致,当异步线程发现了这个值快要过期的的时候,立刻对内置的这个时间进行延长,并且重新从数据库进行数据加载,最后在设置到缓存中。

什么是缓存雪崩

缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。

解决方案

1、最有效的解决方案就是,key的过期时间后面随机添加一个数(比如1-10分钟),这样就可以将热点key的过期时间比较均匀的分散开来,避免热点key扎堆过期

2、缓存使用高可用集群模式,这样就减少穿线缓存服务的故障带来的异常

3、不设置热点数据的过期时间,后台操作的时候对缓存进行异步更新操作,比较适用于对缓存一致性要求不严格的场景

4、使用锁或者队列,确保缓存的单线程写操作(这种方案是比较影响高并发量)

5、假如缓存发生雪崩情况,采取服务立刻熔断、限流、降级的措施保障服务的稳定性

6、双key策略,主key设置过期时间,备key不设置过期时间,当主key失效时,直接返回备key值。

总结

本章共讲解了缓存的三种异常情况,上述的三种错误,都是因为原本就应该访问缓存中数据的,但却在缓存中不存在,亦或者是服务出现故障,导致程序流量直接进入到了数据库请求才导致的问题。

好了,今天关于缓存的只是就到这里吧,欢迎大家点击下方卡片,关注我的《coder练习生》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ybb_ymm

你的鼓励会是对我最大的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值