第二章 缓存雪崩、缓存穿透与缓存击穿
创始人
2024-06-03 01:01:25
0

缓存雪崩

通常我们为了保证缓存中的数据与数据库中的数据一致性,会给 Redis 里的数据设置过期时间,当缓存数据过期后,用户访问的数据如果不在缓存里,业务系统需要重新生成缓存,因此就会访问数据库,并将数据更新到 Redis 里,这样后续请求都可以直接命中缓存。

那么,当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃,这就是缓存雪崩的问题。

可以看到,发生缓存雪崩有两个原因:

  • 大量数据同时过期;

  • Redis 故障宕机;

大量缓存数据同时过期,我们可以在对缓存数据设置过期时间时,给这些数据的过期时间加上一个随机数,这样就保证数据不会在同一时间过期。,Redis 故障宕机可以部署主从集群如果主机宕机,从节点立即代替主机继续提供缓存服务。

使用互斥锁解决大量数据同时过期

互斥锁

当业务线程在处理用户请求时,如果发现访问的数据不在 Redis 里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存(从数据库读取数据,再将数据更新到 Redis 里),当缓存构建完成后,再释放锁。未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。

实现互斥锁的时候,最好设置超时时间,不然第一个请求拿到了锁,然后这个请求发生了某种意外而一直阻塞,一直不释放锁,这时其他请求也一直拿不到锁,整个系统就会出现无响应的现象。

缓存穿透

当用户访问的数据,既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据,没办法构建缓存数据,来服务后续的请求。那么当有大量这样的请求到来时,数据库的压力骤增,这就是缓存穿透的问题。

缓存穿透的发生一般有这两种情况:

业务误操作,缓存中的数据和数据库中的数据都被误删除了,所以导致缓存和数据库中都没有数据;

黑客恶意攻击,故意大量访问某些读取不存在数据的业务;

应对缓存穿透的方案,常见的方案有三种。

第一种方案,非法请求的限制;

第二种方案,缓存空值或者默认值;

第三种方案,使用布隆过滤器快速判断数据是否存在,避免通过查询数据库来判断数据是否存在;

第一种方案,非法请求的限制

当有大量恶意请求访问不存在的数据的时候,也会发生缓存穿透,因此在 API 入口处我们要判断求请求参数是否合理,请求参数是否含有非法值、请求字段是否存在,如果判断出是恶意请求就直接返回错误,避免进一步访问缓存和数据库。

第二种方案,缓存空值或者默认值

当我们线上业务发现缓存穿透的现象时,可以针对查询的数据,在缓存中设置一个空值或者默认值,这样后续请求就可以从缓存中读取到空值或者默认值,返回给应用,而不会继续查询数据库。

TODO还没学到::::第三种方案,使用布隆过滤器快速判断数据是否存在,避免通过查询数据库来判断数据是否存在。

————————————————

版权声明:本文为CSDN博主「小林coding」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_34827674/article/details/123463175

缓存击穿

我们的业务通常会有几个数据会被频繁地访问,比如秒杀活动,这类被频地访问的数据被称为热点数据。

如果缓存中的某个热点数据过期了,此时大量的请求访问了该热点数据,就无法从缓存中读取,直接访问数据库,数据库很容易就被高并发的请求冲垮,这就是缓存击穿的问题。

互斥锁方案

保证同一时间只有一个业务线程更新缓存,未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。

不给热点数据设置过期时间

由后台异步更新缓存,或者在热点数据准备要过期前,提前通知后台线程更新缓存以及重新设置过期时间;

总结

缓存异常会面临的三个问题:缓存雪崩、击穿和穿透。

其中,缓存雪崩和缓存击穿主要原因是数据不在缓存中,而导致大量请求访问了数据库,数据库压力骤增,容易引发一系列连锁反应,导致系统奔溃。不过,一旦数据被重新加载回缓存,应用又可以从缓存快速读取数据,不再继续访问数据库,数据库的压力也会瞬间降下来。因此,缓存雪崩和缓存击穿应对的方案比较类似。

而缓存穿透主要原因是数据既不在缓存也不在数据库中。因此,缓存穿透与缓存雪崩、击穿应对的方案不太一样。

我这里整理了表格,你可以从下面这张表格很好的知道缓存雪崩、击穿和穿透的区别以及应对方案。

参考:

更多详细细节请参考:

https://blog.csdn.net/qq_34827674/article/details/123463175

鸣谢:https://blog.csdn.net/qq_34827674

相关内容

热门资讯

热点推荐“丫丫竞技到底有没有透... 您好:丫丫竞技确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发...
热点推荐“掌悦开原麻将到底有没... 掌悦开原麻将这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这...
热点推荐“JJ斗地主到底有没有... 热点推荐“JJ斗地主到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就...
热点推荐“MintlLedge... 热点推荐“MintlLedgers到底有没有透视挂吗”原来真的有挂;原来确实真的有挂(需添加指定薇7...
热点推荐“小唐乐家园到底有没有... 热点推荐“小唐乐家园到底有没有透视挂吗”原来真的有挂;原来确实真的有挂(需添加指定薇7198902获...
热点推荐“橘子派对到底有没有透... 热点推荐“橘子派对到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”的a...
热点推荐“峰游科技到底有没有透... 热点推荐“峰游科技到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”的a...
热点推荐“中至杭州麻将到底有没... 您好:中至杭州麻将确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都...
热点推荐“超跑捕鱼到底有没有透... 热点推荐“超跑捕鱼到底有没有透视挂吗”原来真的有挂一、超跑捕鱼AI软件牌型概率发牌机制”必胜“技巧 ...
热点推荐“湖南快三到底有没有透... 热点推荐“湖南快三到底有没有透视挂吗”原来真的有挂是一款可以让一直输的玩家,快速成为一个“必胜”的a...
热点推荐“友约山西麻将到底有没... 热点推荐“友约山西麻将到底有没有透视挂吗”原来真的有挂一、友约山西麻将AI软件牌型概率发牌机制”必胜...
热点推荐“科学计算器到底有没有... 热点推荐“科学计算器到底有没有透视挂吗”原来真的有挂1、让任何用户在无需AI插件第三方神器的情况下就...
热点推荐“牵手跑得快到底有没有... 热点推荐“牵手跑得快到底有没有透视挂吗”原来真的有挂一、牵手跑得快AI软件牌型概率发牌机制”必胜“技...
热点推荐“湖南跑胡子到底有没有... 热点推荐“湖南跑胡子到底有没有透视挂吗”原来真的有挂;原来确实真的有挂(需添加指定薇7198902获...
热点推荐“越乡游斗地主到底有没... 亲,越乡游斗地主这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,越乡游斗地主的开挂...
热点推荐“无为好运麻将到底有没... 您好,无为好运麻将这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏...
热点推荐“堆金城棋牌到底有没有... 热点推荐“堆金城棋牌到底有没有透视挂吗”原来真的有挂一、堆金城棋牌AI软件牌型概率发牌机制”必胜“技...
热点推荐“欢乐茶馆到底有没有透... 欢乐茶馆这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这款游...
热点推荐“微乐河北麻将到底有没... 热点推荐“微乐河北麻将到底有没有透视挂吗”原来真的有挂;原来确实真的有挂(需添加指定薇7198902...
热点推荐“多乐掼蛋到底有没有透... 热点推荐“多乐掼蛋到底有没有透视挂吗”原来真的有挂;原来确实真的有挂(需添加指定薇7198902获取...