广告
返回顶部
首页 > 资讯 > 精选 >Redis缓存击穿、缓存穿透、缓存雪崩如何解决
  • 578
分享到

Redis缓存击穿、缓存穿透、缓存雪崩如何解决

2023-07-05 17:07:38 578人浏览 薄情痞子
摘要

本篇内容介绍了“Redis缓存击穿、缓存穿透、缓存雪崩如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Redis缓存使用场景Redis

本篇内容介绍了“Redis缓存击穿、缓存穿透、缓存雪崩如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Redis缓存使用场景

Redis会把数据库中经常被查询的数据缓存起来,比如热点数据,这样当用户通过网站或APP来访问的时候,就不需要到数据库中去查询了,而是直接获取 Redis中的缓存数据,从而降低了后端数据库的读取压力。如果说用户查询的数据Redis中没有,此时用户的查询请求就会转到数据库,当数据库将数据返回给客户端时,同时会将数据缓存到 Redis中,这样用户再次读取时,就可以直接从Redis中获取数据。流程图如下所示:

Redis缓存击穿、缓存穿透、缓存雪崩如何解决

Redis缓存穿透

缓存穿透是指用户恶意的发起大量请求去查询一个缓存(Redis)和数据库(DB)中都没有的数据,出于容错考虑从数据库(DB)查不到数据则不写入缓存(Redis)这将导致每个请求都要到数据库(DB)中查询,失去了缓存的意义,从而导致数据库因压力过大挂掉。

流程图如下所示:

Redis缓存击穿、缓存穿透、缓存雪崩如何解决

解决方案

1.对空值缓存

上面我们也介绍了,之所以会发生穿透,是因为缓存中没有存储这些空数据的key,从而导致每次查询都到数据库去了。

那么我们就可以为这些key的值设置null丢到缓存里面去,后面再出现查询这个key 的请求的时候,直接返回null ,就不用在到数据库中去走一圈了。但是别忘了设置过期时间。

关键代码如下:

Redis缓存击穿、缓存穿透、缓存雪崩如何解决

2.添加参数校验

我们可以在接口层添加校验,不合法的直接返回即可,没必要做后续的操作。

例如:使用bitmaps类型定义一个可以访问名单,名单id作为bitmaps的偏移量,每次访问时与bitmaps中的id进行比较,如果访问id不在bitmaps中,则进行拦截,不给其访问。

3.采用布隆过滤器

布隆过滤器(Bloom Filter),Bloom Filter 类似于一个hash set 用来判断某个元素(key)是否存在于某个集合中,不存在return就好了,存在就去查DB刷新缓存KV再return,它的优点是空间效率和查询时间都比一般算法快,缺点是有一定的误识别率和删除困难。

布隆过滤器的工作方式:

一个空的布隆过滤器是一个由m个二进制位构成的数组

Redis缓存击穿、缓存穿透、缓存雪崩如何解决

以上只是画了布隆过滤器的很小很小的一部分,实际布隆过滤器是非常大的数组(这里的大是指它的长度大,并不是指它所占的内存空间大)。

当一个数据进行存入布隆过滤器的时候,会经过若干个哈希函数进行哈希,得到对应的哈希值作为数组的下标,然后将初始化的位数组对应的下标的值修改为1,结果图如下:

Redis缓存击穿、缓存穿透、缓存雪崩如何解决

当再次进行存入第二个值的时候,修改后的结果的原理图如下:

Redis缓存击穿、缓存穿透、缓存雪崩如何解决

那么为什么会有误判率呢?

假设在我们多次存入值后,在布隆过滤器中存在x、y、z这三个值,布隆过滤器的存储结构图如下所示:

Redis缓存击穿、缓存穿透、缓存雪崩如何解决

当我们要查询的时候,比如查询M这个数,实际中M这个数是不存在布隆过滤器中的,经过哈希函数计算后得到M的哈希值分别为1和7,结构原理图如下:

Redis缓存击穿、缓存穿透、缓存雪崩如何解决

经过查询后,发现1和7位置所存储的值都为1,但是1和7的下标分别是X和Z经过计算后的下标位置的修改,该布隆过滤器中实际不存在M,那么布隆过滤器就会误判改值可能存在,因为布隆过滤器不存元素值,所以存在误判率。

那么为什么不能删除元素呢?

原因很简单,因为删除元素后,将对应元素的下标设置为零,可能别的元素的下标也引用改下标,这样别的元素的判断就会受到影响。

Redis缓存雪崩

缓存雪崩是指大量的应用请求无法在Redis缓存中进行处理,紧接着应用将大量请求发送到数据库层,导致数据库层的压力激增。

缓存雪崩一般是由两个原因导致的,应对方案也有所不同。第一个原因是:缓存中有大量数据同时过期,导致大量请求无法得到处理。第二个原因是:Redis 缓存实例发生故障宕机了,无法处理请求,这就会导致大量请求一下子积压到数据库层,从而发生缓存雪崩。

流程图如下所示:

Redis缓存击穿、缓存穿透、缓存雪崩如何解决

解决方案

1.大量热点数据同时失效带来的缓存雪崩问题

避免热key同时失效

使用 EXPIRE命令给每个数据设置过期时间时,给这些数据的过期时间增加一个较小的随机数(例如,随机增加 1~3 分钟)。这样一来,不同数据的过期时间有所差别,但差别又不会太大。既避免了大量数据同时过期,同时也保证了这些数据基本在相近的时间失效,仍然能满足业务需求。

2. 服务降级

所谓的服务降级,是指发生缓存雪崩时,针对不同的数据采取不同的处理方式,例如:

当业务应用访问的是非核心数据时,暂时停止从缓存中查询这些数据,而是直接返回预定义信息、空值或是错误信息;

当业务应用访问的是核心数据时,仍然允许查询缓存,如果缓存缺失,也可以继续通过数据库读取。

这样一来,我们就避免了大量请求因缓存缺失,而积压到数据库系统,保证了数据库系统的正常运行。

3. Redis 缓存实例发生故障宕机带来的缓存雪崩问题

从事前预防的角度,我们可以通过主从节点的方式构建 Redis 缓存高可靠集群。如果 Redis缓存的主节点故障宕机了,从节点还可以切换成为主节点,继续提供缓存服务,避免了由于缓存实例宕机而导致的缓存雪崩问题。

如果实际业务系统真发生了Redis 缓存实例不可用的情况,我们可以在业务系统中实现服务熔断或请求限流机制。所谓的服务熔断,是指在发生缓存雪崩时,为了防止引发连的数据库雪崩,甚至是整个系统的崩溃,我们暂停业务应用对缓存系统的接口访问。

Redis缓存击穿

我们在平常高并发的系统中,大量的请求同时查询一个key时,假设此时这个key正好失效了,就会导致大量的请求都打到数据库上面去,这种现象我们称为击穿。

这么看缓存击穿和缓存雪崩有点像,但是又有一点不一样,缓存雪崩是因为大面积的缓存失效,打崩了DB,而缓存击穿不同的是「缓存击穿」是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞,如下图所示:

Redis缓存击穿、缓存穿透、缓存雪崩如何解决

解决方案

1. 热key不过期

预先设置热门数据:在Redis高峰访问时期,提前设置热门数据到缓存中,对这些热key不设置失效时间,不过这样设置需要区分场景。

实时调整:实时监控哪些数据热门,实时调整key过期时间。

2. 分布式

为了避免出现缓存击穿的情况,我们可以在第一个请求去查询数据库的时候对他加一个分布式锁,其余的查询请求都会被阻塞住,直到锁被释放,后面的线程进来发现已经有缓存了,就直接走缓存,从而保护数据库。但是也是由于它会阻塞其他的线程,此时系统吞吐量会下降。需要结合实际的业务去考虑是否要这么做。

关键代码如下:

Redis缓存击穿、缓存穿透、缓存雪崩如何解决

总结

缓存击穿

key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。一般通过互斥锁,热点数据永不过期,定时刷新过期时间等方法解决该问题。

缓存穿透

key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。一般通过对空数据进行缓存,布隆过滤器等方法解决该问题。

缓存雪崩

当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。一般通过加锁排队,设置过期时间随机值等方法解决该问题。

“Redis缓存击穿、缓存穿透、缓存雪崩如何解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Redis缓存击穿、缓存穿透、缓存雪崩如何解决

本文链接: https://www.lsjlt.com/news/354179.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis缓存穿透、缓存击穿、缓存雪崩
    使用redis作为缓存时,存在一些应用问题,包括缓存穿透、缓存击穿、缓存雪崩。 Redis缓存穿透、缓存击穿缓存雪崩 redis常被用于作为后台数据库的缓存,缓存一些热点访问数据,根据局部性原...
    99+
    2014-07-07
    Redis缓存穿透 缓存击穿 缓存雪崩
  • Redis缓存击穿、缓存穿透、缓存雪崩如何解决
    本篇内容介绍了“Redis缓存击穿、缓存穿透、缓存雪崩如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Redis缓存使用场景Redis...
    99+
    2023-07-05
  • redis的缓存雪崩、缓存穿透和缓存击穿
       缓存雪崩: 比如给缓存中的key设置了统一的过期时间,而在过期时间点,有大量的请求进来,这个时候redis中没有用户请求的资源,所以所有的请求会全部拥到数据库,如果数据库有报警监测的话,可能会报一下警,然后数据库就挂掉了。如果这时候把...
    99+
    2017-11-21
    redis的缓存雪崩 缓存穿透和缓存击穿
  • 如何解决redis缓存穿透、缓存击穿、缓存雪崩的问题
    这篇文章主要介绍了如何解决redis缓存穿透、缓存击穿、缓存雪崩的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。缓存穿透:key中对应的...
    99+
    2022-10-18
  • redis缓存雪崩、缓存击穿和缓存穿透是什么
    这篇文章主要介绍了redis缓存雪崩、缓存击穿和缓存穿透是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇redis缓存雪崩、缓存击穿和缓存穿透是什么文章都会有所收获,下面我...
    99+
    2022-11-30
    redis
  • Redis缓存击穿,雪崩,穿透解决方案
    缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,...
    99+
    2014-09-27
    Redis缓存击穿,雪崩,穿透解决方案
  • redis中缓存穿透击穿雪崩如何解决
    这篇文章将为大家详细讲解有关redis中缓存穿透击穿雪崩如何解决,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。二:缓...
    99+
    2023-06-15
  • 缓存穿透,缓存击穿,缓存雪崩解决方案分析
    阅读本文大概需要 3.7 分钟。一、前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。二、缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则...
    99+
    2023-06-05
  • Redis系列(六)Redis 的缓存穿透、缓存击穿和缓存雪崩
    NoSQL 开发中或多或少都会用到,也是面试必问知识点。最近这几天的面试每一场都问到了。但是感觉回答的并不好,还有很多需要梳理的知识点。这里通过几篇 Redis 笔记整个梳理一遍,后面再加上面试题。 Redis 系列: ...
    99+
    2021-02-26
    Redis系列(六)Redis 的缓存穿透 缓存击穿和缓存雪崩
  • 分析Redis缓存雪崩、击穿、穿透
    这篇文章主要介绍“分析Redis缓存雪崩、击穿、穿透”,在日常操作中,相信很多人在分析Redis缓存雪崩、击穿、穿透问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分析Redi...
    99+
    2022-10-19
  • Redis中三大缓存现象缓存击穿、缓存穿透、缓存雪崩的解决方法
    这篇文章主要介绍“Redis中三大缓存现象缓存击穿、缓存穿透、缓存雪崩的解决方法”,在日常操作中,相信很多人在Redis中三大缓存现象缓存击穿、缓存穿透、缓存雪崩的解决方法问题上存在疑惑,小编查阅了各式资料...
    99+
    2022-10-18
  • Redis中缓存雪崩、缓存击穿和缓存穿透的示例分析
    这篇文章主要为大家展示了“Redis中缓存雪崩、缓存击穿和缓存穿透的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Redis中缓存雪崩、缓存击穿和缓存穿...
    99+
    2022-10-18
  • Redis缓存一致性、缓存穿透、缓存击穿及缓存雪崩问题分析
    本篇内容介绍了“Redis缓存一致性、缓存穿透、缓存击穿及缓存雪崩问题分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,...
    99+
    2022-10-19
  • redis中缓存雪崩、缓存击穿、缓存穿透指的是什么意思
    这篇文章主要介绍了redis中缓存雪崩、缓存击穿、缓存穿透指的是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是redis缓存?...
    99+
    2022-10-18
  • Redis中的缓存穿透、缓存雪崩、缓存击穿和缓存一致性怎么理解
    这篇文章主要介绍“Redis中的缓存穿透、缓存雪崩、缓存击穿和缓存一致性怎么理解”,在日常操作中,相信很多人在Redis中的缓存穿透、缓存雪崩、缓存击穿和缓存一致性怎么理解问题上存在疑惑,小编查阅了各式资料...
    99+
    2022-10-19
  • 如何解决Redis缓存穿透和缓存雪崩问题
    这篇文章主要为大家展示了“如何解决Redis缓存穿透和缓存雪崩问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决Redis缓存穿透和缓存雪崩问题”这篇文...
    99+
    2022-10-19
  • redis缓存雪崩和缓存穿透的解决方法
    redis缓存雪崩和缓存穿透的怎么解决?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。缓存穿透缓存穿透是指查询一个一定不存在的数据。由于缓存不命...
    99+
    2022-10-18
  • redis如何解决缓存雪崩和穿透
    本篇内容介绍了“redis如何解决缓存雪崩和穿透”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-18
  • 详解缓存穿透击穿雪崩解决方案
    目录一:前言二:缓存穿透三:解决方案四:缓存雪崩五:解决方案六:缓存击穿七:解决方案1、使用互斥锁(mutexkey)2、"提前"使用互斥锁(mutexkey)3、"永远不过期"4、...
    99+
    2022-11-12
  • 怎么解决Redis缓存雪崩、击穿与穿透问题
    这篇文章主要讲解了“怎么解决Redis缓存雪崩、击穿与穿透问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决Redis缓存雪崩、击穿与穿透问题”吧!...
    99+
    2022-11-30
    redis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作