第二章 缓存雪崩、缓存穿透与缓存击穿
创始人
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

相关内容

热门资讯

安卓系统只有英文翻译,Andr... 你知道吗?在咱们这个科技飞速发展的时代,手机已经成了我们生活中不可或缺的好伙伴。而说起手机,安卓系统...
安卓电视装苹果系统教程,轻松实... 亲爱的电视迷们,你是否曾梦想过在安卓电视上体验苹果系统的流畅与优雅?别再羡慕了,今天就来手把手教你如...
安卓系统换电池的方法 手机用久了,电池续航能力大不如前,是不是你也想给安卓手机来个“换血重生”呢?别急,今天就来手把手教你...
流量卡怎么解决安卓系统,高效使... 你是不是也遇到了这样的烦恼?手机流量不够用,但又不想每个月花大价钱买套餐?别急,今天就来给你支个招,...
dx80刷安卓系统 你有没有想过,给你的dx80手机换换口味呢?没错,就是那个一直默默陪伴你的dx80,今天咱们就来聊聊...
车载安卓系统安吉星卸载,轻松优... 你有没有发现,现在很多车载系统都开始流行起安卓系统了呢?尤其是安吉星,这个在汽车界小有名气的车载系统...
安卓手机系统ios系统升级,全... 你有没有发现,最近你的安卓手机又闹腾起来啦?没错,我又要来跟你聊聊这个让人又爱又恨的话题——安卓手机...
安卓系统7.0功略,深度解析全... 你有没有发现,你的安卓手机最近是不是变得有点儿不一样了?没错,它升级到了安卓系统7.0!这可不是一个...
安卓系统最新价格表,全面解析升... 你有没有发现,最近安卓系统的价格表又有了新变化?没错,这个话题可是让不少手机控们兴奋不已呢!今天,就...
安卓11q1系统,新特性与升级... 你知道吗?最近安卓系统又来了一次大更新,那就是安卓11Q1系统。这可不是一个小打小闹的更新,它可是带...
安卓系统有虾皮吗,便捷购物新体... 你有没有想过,手机里装了安卓系统,是不是也能找到那些让人爱不释手的购物APP呢?今天,就让我来给你揭...
安卓电脑学生管理系统,安卓电脑... 你有没有想过,在繁忙的校园生活中,有一款神器能帮你轻松管理学生信息,让老师们从繁琐的事务中解放出来?...
反向充电怎么用安卓系统 你有没有想过,手机没电的时候,竟然还能给其他设备充电?没错,这就是最近很火的“反向充电”功能。今天,...
爱酷系统跟安卓系统哪个好,揭秘... 你有没有想过,手机系统就像是我们生活的操作系统,每天陪伴着我们,影响着我们的使用体验。今天,就让我来...
小米手机刷安卓p系统,小米手机... 你有没有发现,最近小米手机圈子里掀起了一股热潮?没错,就是刷安卓P系统!这可是个让手机焕发第二春的大...
威图安卓系统升级,畅享智能生活... 你知道吗?最近手机界可是热闹非凡呢!威图安卓系统升级的消息一出,瞬间吸引了无数手机爱好者的目光。这不...
qq软件安卓系统软件,沟通无界 你有没有发现,最近你的手机里那个陪伴你多年的QQ软件又升级啦?没错,就是那个让你和朋友畅聊、分享生活...
安卓10系统有通知推送,畅享便... 你知道吗?最近安卓系统又升级啦!这次可是来到了安卓10系统,听说通知推送功能有了大变化,简直让人眼前...
安卓系统软件白屏,安卓系统软件... 手机屏幕突然变成了白茫茫的一片,这可怎么办?别急,今天就来和你聊聊安卓系统软件白屏这个让人头疼的问题...
美能达打印机安卓系统,轻松实现... 你有没有想过,家里的打印机也能玩转安卓系统?没错,今天就要给你揭秘这款神奇的美能达打印机,看看它是如...