缓存穿透、缓存击穿、缓存雪崩


前言

在做web项目时,我们会用到缓存,因为缓存可以减少数据库的访问压力。当前端界面向后端读取数据时,如果没有缓存,所有的数据请求都会打在数据库上,如果访问量少,不会有什么太大的问题,但是当访问量比较大的时候,很多请求去访问数据库,数据库的压力剧增,导致数据库宕机,我们可以通过实现缓存来解决这一问题。


一、缓存穿透

描述:缓存穿透是指请求的数据在缓存和数据库中都没有,这时候缓存就像透明一样,等于没有。所有的请求都会打在数据库上,导致数据库的压力过大。
示例:例如ID不可能小于0,而恶意攻击者使用大量不合法的数据来请求,而缓存中没有相应的数据,导致所有的请求都打在数据库上,这样会使数据库的压力过大,甚至导致数据库宕机。

解决方案:
1、接口层增加校验,例如上面的示例,ID不可能小于0,我们可以在接口层将其过滤掉,避免恶意攻击。
2、在缓存和数据库中都没有取到值的数据,也可以将其加到缓存中,将请求的数据作为key,null作为value。当再次被请求时就可以从缓存中取值,这样可以避免恶意攻击者使用同一非法数来进行恶意攻击。但是如果恶意攻击者使用的是随机非法数来攻击的话,这种方法就显得力不从心。

二、缓存击穿

描述:缓存击穿和缓存雪崩有些类似,缓存雪崩是大规模的key失效,而缓存击穿是某一个key失效,而在失效之后,有大量的请求请求这个数据,因为key在缓存中已经失效,所以所有的请求都打在数据库上,造成数据库的压力剧增,在高并发的情况下可能会导致数据库宕机。

解决方案:
1、如果业务允许的话设置热点key永不过期
2、使用互斥锁。如果缓存失效的情况,只有拿到锁才可以查询数据库,降低了在同一时刻打在数据库上的请求,防止数据库打死。当然这样会导致系统的性能变差。

三、缓存雪崩

描述:缓存雪崩是指缓存中有大量的数据在同一时间或者较短的时间内全部失效,这时候请求过来,缓存中没有数据,所有的请求都会打在数据库上,导致数据库的压力剧增,甚至可能会导致数据库宕机。宕机后重启数据库,刚启动完可能又会被大量的请求给打死。

解决方案:
1、缓存数据的过期时间设置为随机数,防止同一时间内大量的缓存数据失效。
2、如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
3、设置热点数据永远不过期。

后话

这是本人的学习笔记,如果有错误的地方请指出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值