Redis中的缓存穿透、雪崩、击穿的原因以及解决方案

这篇具有很好参考价值的文章主要介绍了Redis中的缓存穿透、雪崩、击穿的原因以及解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一,什么是缓存穿透、雪崩、击穿?

1、缓存穿透:

是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。

2、缓存雪崩:

我们可以简单的理解为:由于原有缓存失效,新缓存未到时间 (例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。

3、缓存击穿:

某个 key 非常非常热,访问非常的频繁,高并发访问的情况下,当这个 key在失效(可能expire过期了,也可能LRU淘汰了)的瞬间,大量的请求进来,这时候就击穿了缓存,直接请求到了数据库,一下子来这么多,数据库肯定受不了,这就叫缓存击穿。某个key突然失效,然后这时候高并发来访问这个key,结果缓存里没有,都跑到db了。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

三者出现的根本原因是:Redis缓存命中率下降,请求直接打到DB上了

正常情况下,大量的资源请求都会被redis响应,在redis得不到响应的小部分请求才会去请求DB,这样DB的压力是非常小的,是可以正常工作的
Redis中的缓存穿透、雪崩、击穿的原因以及解决方案,redis,缓存,redis,数据库

如果大量的请求在redis上得不到响应,那么就会导致这些请求会直接去访问DB,导致DB的压力瞬间变大而卡死或者宕机。

大量的高并发的请求打在redis上

这些请求发现redis上并没有需要请求的资源,redis命中率降低

因此这些大量的高并发请求转向DB(数据库服务器)请求对应的资源

DB压力瞬间增大,直接将DB打垮,进而引发一系列“灾害”

Redis中的缓存穿透、雪崩、击穿的原因以及解决方案,redis,缓存,redis,数据库

二,对应解决方案

2.1、缓存穿透

根本原因(结合上文)就是:请求根本不存在的资源

举例:客户端发送大量的不可响应的请求(如下图)
Redis中的缓存穿透、雪崩、击穿的原因以及解决方案,redis,缓存,redis,数据库

当大量的客户端发出类似于:https://localhost:9090/user/18933?id=-9527的请求,就可能导致出现缓存穿透的情况。因为数据库DB中本身就没有id=-9527的用户的数据,所以Redis也没有对应的数据,那么这些请求在redis就得不到响应,就会直接打在DB上,导致DB压力过大而卡死情景在线或宕机

解决方式:

对空值进行缓存

类似于上面的例子,虽然数据库中没有id=-9527的用户的数据,但是在redis中对他进行缓存(key=-9527,value=null),这样当请求到达redis的时候就会直接返回一个null的值给客户端,避免了大量无法访问的数据直接打在DB上。

实时监控

对redis进行实时监控,当发现redis中的命中率下降的时候进行原因的排查,配合运维人员对访问对象和访问数据进行分析查询,从而进行黑名单的设置限制服务。

使用布隆过滤器

使用BitMap作为布隆过滤器,将目前所有可以访问到的资源通过简单的映射关系放入到布隆过滤器中(哈希计算),当一个请求来临的时候先进行布隆过滤器的判断,如果有那么才进行放行,否则就直接拦截。

接口校验

类似于用户权限的拦截,对于id=-3872这些无效访问就直接拦截,不允许这些请求到达Redis、DB上。

2.2、缓存雪崩

产生的原因:redis中大量的key集体过期

比如:当redis中的大量key集体过期,可以理解为redis中的大部分数据都被清空了(失效了),那么这时候如果有大量并发的请求来到,那么redis就无法进行有效的响应(命中率急剧下降),请求就都打到DB上了,到时DB直接崩溃。

解决方式:

将失效时间分散开

通过使用自动生成随机数使得key的过期时间是随机的,防止集体过期

使用多级架构

使用nginx缓存+redis缓存+其他缓存,不同层使用不同的缓存,可靠性更强

设置缓存标记

记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去更新实际的key

使用锁或者队列的方式

如果查不到就加上排它锁,其他请求只能进行等待

2.3、缓存击穿

产生的原因:redis中的某个热点key过期,但是此时有大量的用户访问该过期key。

比如:类似于“某明星出轨事件”上了热搜,这时候大量的“粉丝”都在访问该热点事件,但是可能由于某种原因,redis的这个热点key过期了,那么这时候大量高并发对于该key的请求就得不到redis的响应,那么就会将请求直接打在DB服务器上,导致整个DB瘫痪。

解决方式:

提前对热点数据进行设置

类似于新闻、某博等软件都需要对热点数据进行预先设置在redis中

监控数据,适时调整

监控哪些数据是热门数据,实时的调整key的过期时长

使用锁机制

只有一个请求可以获取到互斥锁,然后到DB中将数据查询并返回到Redis,之后所有请求就可以从Redis中得到响应文章来源地址https://www.toymoban.com/news/detail-652538.html

到了这里,关于Redis中的缓存穿透、雪崩、击穿的原因以及解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • redis缓存雪崩、穿透、击穿解决方案

    关于缓存异常,我们常见的有三个问题:缓存雪崩、缓存击穿、缓存穿透。这三个问题一旦发生,会导致大量请求直接落到数据库层面。如果请求的并发量很大,会影响数据库的运行,严重的会导致数据库宕机。 为了避免缓存异常带来的损失,我们需要了解每种异常的原因以

    2024年02月10日
    浏览(39)
  • Redis:缓存击穿、缓存穿透与缓存雪崩的区别、解决方案

            近期学习redis相关原理,记录一下开发过程中Redis的一些常见问题及应对方法。 一句话总结:先查 redis发现没数据 ,再去 数据库查发现还是没数据 。 这种情况下 缓存永远不会生效 ,数据库将承担巨大压力。         我们知道,redis的缓存作用,是在客户端发起查

    2024年02月06日
    浏览(37)
  • redis实战-缓存三剑客穿透击穿雪崩解决方案

    缓存穿透 :缓存穿透是指客户端请求的 数据在缓存中和数据库中都不存在 ,这样缓存永远不会生效,这些请求都会打到数据库, 造成数据库压力 ,也让缓存没有发挥出应有的作用 缓存空对象 当我们客户端访问不存在的数据时,先请求redis,但是此时redis中没有数据,此时

    2024年02月11日
    浏览(33)
  • 【Redis从入门到进阶】第 6 讲:缓存雪崩、击穿、穿透场景与解决方案

    本文已收录于专栏 🍅《Redis从入门到进阶》🍅    本专栏开启,目的在于帮助大家更好的掌握学习 Redis ,同时也是为了记录我自己学习 Redis 的过程,将会从基础的数据类型开始记录,直到一些更多的应用,如缓存击穿还有分布式锁以及 Redis 持久化等。希望大家有问题也可

    2023年04月12日
    浏览(25)
  • 缓存雪崩、缓存击穿、缓存穿透原因及解决办法

    缓存雪崩是指在缓存中的大量数据在同一个时刻全部过期,导致原本这些可以由缓存中间件处理的高并发请求,一下子全部打到数据库,导致数据库服务器崩溃的一种现象。那么出现缓存雪崩的原因可以有①:缓存中间件宕机。②:缓存中大部分key都设置了相同的时间,导致

    2024年02月08日
    浏览(37)
  • SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】

    上一篇实现了单体应用下如何上锁,这一篇主要说明如何在分布式场景下上锁 上一篇地址:加锁 需要注意的点是: 在上锁和释放锁的过程中要保证 原子性操作 核心是上锁和解锁的过程 关于解锁使用脚本参考:SET key value [EX seconds] [PX milliseconds] [NX|XX] 3.1 一个服务按照多个端口同时

    2023年04月10日
    浏览(38)
  • 高并发下缓存失效问题(穿透、雪崩、击穿),以及本地锁、Redis分布锁、Redisson锁、SpringCache使用

    说明 :以不存在的数据攻击,数据库压力增加导致崩溃 风险 :利用不存在数据攻击,数据库瞬时压力增大,导致崩溃 解决 :设置不存在数据为 null 值 与 短暂过期时间 布隆过滤器 使用案例: redission布隆过滤器解决缓存穿透问题,定时刷新bloomFilter中的数据 说明 :设置缓

    2024年02月08日
    浏览(41)
  • 缓存穿透、缓存雪崩、缓存击穿解决方案

    缓存就是数据交换的缓冲区(称作Cache),是存贮数据的临时地方,一般读写性能较高。 需求:添加ShopTypeController中的queryTypeList方法,添加查询缓存 业务场景: 低一致性需求:使用内存淘汰机制。例如店铺类型的查询缓存 高一致性需求:主动更新,并以超时剔除作为兜底方

    2023年04月09日
    浏览(67)
  • redis 缓存雪崩 && 缓存击穿 && 缓存穿透

    什么是缓存雪崩 当我们提到缓存系统中的问题,缓存雪崩是一个经常被讨论的话题。缓存雪崩是指在某一时刻发生大量的缓存失效,导致瞬间大量的请求直接打到了数据库,可能会导致数据库瞬间压力过大甚至宕机。尤其在高并发的系统中,这种情况会导致连锁反应,整个系

    2024年02月07日
    浏览(37)
  • Redis 缓存穿透、缓存雪崩、缓存击穿

    缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。 常见的解决方案有两种:         缓存空对象                  优点:实现简单,维护方便                 缺点: 额外的内存消耗 可能造

    2024年02月02日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包