缓存的雪崩,击穿和穿透

随着系统的并发越来越高,基于磁盘读写的数据库面对大量请求表示压力很大,因此引入了缓存技术,将高频查询的热点数据放入缓存,顶在数据库前面,请求进来后,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。

【缓存雪崩】

什么是缓存雪崩?
雪崩,首先联想到的关键词是,大量、同时、瞬间爆炸
没错,所谓缓存雪崩,就是缓存中的大量key同时失效,导致一瞬间所有请求直接打到数据库上,使数据库瞬间压力过重,甚至宕机。
可能出现的原因:
1.一大批热点数据因为同时加入缓存所以失效时间也在同一时刻
2.你的缓存服务器挂了
如何避免缓存雪崩:
1.数据放入缓存时,将失效时间通过一定比例的随机来打散,防止大批数据同一时刻失效
2.热点数据永不失效
3.Redis 高可用,主从+哨兵,Redis cluster
4.排队、限流、降级

【缓存击穿】

什么是缓存击穿?
缓存击穿实际上跟缓存雪崩原理差不多,只不过缓存雪崩指大量、同时,而缓存击穿指少量、热点,指的是某些超级热点的数据在缓存过期的瞬间,所有请求瞬间打到数据库上,使数据库瞬间压力过重。
如何避免缓存击穿:
1.热点数据永不过期
2. 拿数据时加互斥锁,同一时刻只有一个持有互斥锁的线程可以碰到数据库,其他线程等待,如果数据库内有数据,持有互斥锁的线程将数据存入缓存后,其他线程就可以从缓存中拿到数据,也不用走到数据库那一关了。

【缓存穿透】

什么是缓存穿透?
缓存穿透指缓存中和数据库中都没有的记录,被频繁请求和调用,每次请求由于先去缓存中找,找不到就打到数据库,数据库中也没有数据,所以没办法更新缓存,下一次还是能打到数据库,这种情况就叫缓存穿透。
需要注意一点就是,由于缓存穿透指的是请求的数据在数据库和缓存中都不存在,所以这类请求很可能来自恶意攻击!比如你数据库中的id都是自增的正整数,有人总拿-1来请求数据,那么每次都能透过缓存打到你的数据库,并进行一次无用查询。
如何避免缓存穿透:
1.后端接口入口处做好参数校验,该正整数的地方,进来负数就直接打回去。
2.从缓存取不到的数据,在数据库中也没有取到,这时可以将key-null存入缓存,缓存有效时间可以设置短点,防止攻击用户反复用同一个id暴力攻击,但这样其实也只能防住最低级的攻击,比如人家-1用完用-2,-3…也是能每次打到数据库的,笑
3.上布隆过滤器!
布隆过滤器简单来说就是通过哈希算法在极短的时间内判断请求的数据是否在数据集中存在,它可以给出两种结果,a.可能存在 b.一定不存在
这就够了!只要把布隆同志告诉你一定不存在的数据请求打回去就好了~
布隆过滤器不展开讲了,感兴趣的小伙伴可以自行学习一下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值