首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
说说缓存穿透、击穿、雪崩的区别。
[问答题]
说说缓存穿透、击穿、雪崩的区别。
添加笔记
求解答(0)
邀请回答
收藏(283)
分享
纠错
77个回答
添加回答
115
十七_
缓存穿透:客户端访问不存在的数据,使得请求直达存储层,导致负载过大,直至宕机。原因可能是业务层误删了缓存和库中的数据,或是有人恶意访问不存在的数据。解决方式:1.存储层未命中后,返回空值存入缓存层,客户端再次访问时,缓存层直接返回空值。2.将数据存入布隆过滤器,访问缓存之前经过滤器拦截,若请求的数据不存在则直接返回空值。 缓存击穿:一份热点数据,它的访问量非常大,在它缓存失效的瞬间,大量请求直达存储层,导致服务崩溃。解决方案:1.永不过期:对热点数据不设置过期时间。2.加互斥锁,当一个线程访问该数据时,另一个线程只能等待,这个线程访问之后,缓存中的数据将被重建,届时其他线程就可以从缓存中取值。 缓存雪崩:大量数据同时过期、或是redis节点故障导致服务不可用,缓存层无法提供服务,所有的请求直达存储层,造成数据库宕机。解决方案:1.避免数据同时过期,设置随机过期时间。2.启用降级和熔断措施。3.设置热点数据永不过期。4.采用redis集群,一个宕机,另外的还能用
发表于 2022-04-24 17:13:30
回复(3)
15
番茄酱要加满
缓存穿透:大量访问redis缓存中不存在的数据,导致程序直接请求数据库,负载过大宕机。 击穿:热点过大的数据在失效瞬间大量请求储存层。 雪崩:大量数据redis过期
发表于 2022-05-12 10:30:25
回复(0)
7
林邵晨
穿透:访问key不存在,,导致大量请求越过redis访问数据库,导致数据库宕机 击穿:热点key过期失效,导致大量请求越过redis访问数据库,导致数据库宕机 雪崩:短时间内,大量key过期,导致大量请求越过redis访问数据库,导致数据库宕机
发表于 2022-06-01 20:11:30
回复(0)
6
万里迢迢
缓存雪崩指的是缓存的大面积的请求访问失效,直接访问到数据库,缓存击穿是指一份热点数据缓存失效,突然涌入大量的访问请求此时也会直接访问到数据库底层从而使服务崩溃。缓存穿透是指大量请求访问一个本身不存在的数据。
发表于 2022-05-04 21:55:43
回复(0)
3
牛客117654258号
缓存穿透:高并发的请求绕过redis缓存 用一个不存在的key持续对数据库进行访问,而该key在数据库也不存在,直到数据库崩溃。解决方法:对null值进行缓存,设置过期时间。设置白名单用户。使用布隆过滤器。缓存击穿:高并发的请求访问redis中某一热点数据,热点数据的key过期,大量请求瞬时到数据库,数据库崩溃。解决方案:对一些热点数据进行过期时间调整和备份。缓存雪崩:大量并发 访问大量过期的key 一瞬间redis和数据库崩溃。解决方案:排开不同数据的过期时间
发表于 2022-07-13 20:56:37
回复(0)
2
伟大的安德鲁在改简历
缓存穿透是指缓存和数据库中都没有数据,此时用户不断发出请求,从而导致数据库压力过大; 缓存击穿是指缓存中没有数据(一般是缓存时间到期,)但数据库中存在数据,此时如果并发用户特别多,同时读缓存没有读到数据,又同时去数据库中去读取该数据,会引起数据库压力瞬间增大,造成压力过大; 缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机,和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据缓存都查不到从而查数据库;
发表于 2022-08-09 21:54:15
回复(0)
2
Chaos1874
缓存穿透:即大量请求同时访问一个不存在的数据,由于缓存中不存在,就会进入数据库,导致数据库崩溃,由于数据库查不到数据,也就不会建立redis缓存使得下次访问压力依然在数据库。解决方案:1,对于此类数据数据库查不到时,依然在redis建立一个空对象作为下次查询的返回。2,使用布隆过滤器拦截此类查不到的数据直接返回空。缓存击穿:指某个访问量巨大的热点数据突然过期的瞬间,大量请求进入到数据库,导致数据库崩溃。解决方案:1,设置这些热点数据永不过期。2,设置这些热点数据逻辑过期,当判断逻辑过期后,自动fork一个子线程区缓存中重建该数据。3,在数据库中为该数据库建立互斥锁。当大量线程访问时只有一个线程获取到并在缓存中重建。缓存雪崩:指时刻大量的key过期或者redis服务崩溃导致请求落在数据库中导致其宕机。解决方案;在为每个数据设定过期时间时附加随机值,避免大量数据同时过期。2,启用降级或熔断措施:当redis崩溃时,直接返回空数据给客户端。3:建立缓存服务集群并使用哨兵监控。
发表于 2022-06-21 20:09:10
回复(0)
2
玖语
缓存穿透是指客户端查询了根本不存在的数据导致请求直达存储层导致其负载过大造成宕机。解决方式有设置缓存空对象和布隆过滤器的方式。缓存空对象指到存储层未命中仍然返回空值缓存到redis,当客户端再次请求就将空对象返回。布隆过滤器是指客户端请求前先进入过滤器,如果请求的数据不存在则直接返回空值。缓存击穿是指当一份访问量非常大的热点数据失效时,大量的请求直达存储层导致服务崩溃。解决方式有不设置过期时间或设置逻辑过期时间,过期后使用单独的线程重建缓存。也可以对数据的访问加互斥锁,一个线程访问结束后缓存数据被重建。缓存雪崩是指某一时刻缓存层无法提供服务导致全部请求直达存储层造成数据库宕机。解决方式有设置过期时间时加一个随机数避免大量数据同时过期。第二种是降级和熔断,若访问的不是核心数据直接将预定信息返回。第三种是构建高可用的Redis服务,通过哨兵或集群模式。
发表于 2022-06-18 14:37:22
回复(0)
1
走吗
缓存穿透:客户端访问既不存在于缓存的和数据库的key,导致所有的请求直接打到了数据库上,导致数据库负载过高。解决方式:设置无效key,指标不治本,如果每次都是不一样的key呢。采用布隆过滤器,每次请求先去过滤器找有没有这个key。 缓冲击穿:热点key失效,导致大量请求直接打在数据库上。解决方案:1.永不过期,治标不治本。 2.提前预热,主动讲热点key过期时间设置在高峰期之后,如秒杀 3.互斥锁,写数据到缓存前,保证只有一个请求落到数据库上,其他只能等这个请求写完缓存,释放锁才能访问。 缓存雪崩:大量key失效或者redis直接宕机,导致请求直接打在数据库上。 redis服务器层面:采用集群,限流,多级缓存。 key失效情况:提前预热,设置随机的过期时间,或者不失效(不推荐),提前预热可以使用定时任务或者消息队列,主动将热点key加入到缓存,设置一个比较合理的过期时间。
编辑于 2024-04-11 10:31:47
回复(0)
1
大星星不见了
1、缓存穿透:客户端访问不存在的数据,没有经过缓存层,直接作用到数据库,造成宕机;解决方法:1、设置缓存空的对象,数据库没有命中就返回个空值存到缓存种,下次直接从缓存种返回空值。2、设置布隆过滤器:将数据存入布隆过滤器,访问缓存前先经过过滤器拦截,如果没有就返回空。 2、缓存击穿:缓存中某个热点数据不存在了,然后客户端大量的访问这个数据,直接作用到数据库上,造成宕机;解决方法:热带数据设置为永不过期或过期时间长。2、加互斥锁;3、缓存雪崩:大量的缓存数据失效,直接访问到了数据库,造成数据库崩溃。解决方法:1、设置缓存随机过期时间。2、使用redis集群,一个redis宕机,别的还能用。3、启用熔断降级4、热点数据永不过期
发表于 2023-03-27 15:03:07
回复(0)
1
旧城以西γ
缓存穿透就是用户访问的数据在缓存和数据库中都不存在,导致大量请求每次都要去查询数据库,造成数据库压力过大直至宕机。 缓存击穿就是某个热点key突然失效,导致大量的请求范文数据库,引起数据库压力急剧增大。 缓存雪崩就是大量的key在同一时期同时失效,大量的请求高并发到数据库,导致数据库压力急剧增大,极有可能出现宕机。
发表于 2023-03-13 22:14:19
回复(0)
1
张锦豪
穿透是指用户查询数据时,缓存和数据库中都没有该数据,但用户一直请求就会给数据库造成一定的压力。解决方案:1、布隆过滤器2、接口校验3、给空值设置个默认值。击穿是大量用户查询该热点数据时,但此时缓存失效,造成大量用户并发访问数据库,造成压力。解决方案:1、接口限流2、加互斥锁3、热点数据永不过期 雪崩是指大量热点数据同时过期,导致大量请求访问数据库,给数据库造成一定的压力。解决方案:1、热点数据永不过期,或者是过期时间随机。2、多台服务器多集群部署(哨兵模式)
发表于 2023-03-10 08:55:44
回复(0)
1
amo哥
* 缓存穿透是指大量请求的key不在缓存中,导致请求直接落到数据库中,没有经过缓存这一层。解决方法1)设置无效key,当缓存没有命中的时候返回空值并存入缓存中,当客户端再次访问的时候就直接从缓存中返回空值(""),此外,可以设置无效key的过期时间短一点,防止存储太多无效的key。2)还可以使用布隆过滤器来帮助我们判断请求的数据是否在我们的缓存和数据库中,如果判断没有就直接返回异常信息给客户端。 * 缓存击穿也叫热点key问题,指的是某一份被高并发访问且缓存重建业务比较复杂的key突然失效了,导致大量请求落到了数据库中,解决的方法可以通过设置热点key的永不失效,或者加互斥锁,当一个线程从缓存中查询数据的时候,如果缓存没有命中,就加互斥锁,这样其他线程就只能等待直到完成缓存重建后才能访问该数据。 * 缓存雪崩是指同一时间内大量key失效,导致请求落到数据库中。针对Redis服务器突然宕机,可以使用Redis集群,也可以通过限流来避免处理大量的请求;针对大量热点key失效的问题,可以设置它们的过期时间为随机,或者设置永不过期。
发表于 2022-11-08 01:04:07
回复(0)
1
总之就是心好累
缓存穿透是指所请求的数据既不在缓存中也不在数据库中,大量这样的请求会对数据库造成极大的压力。解决方法有两个,第一个是缓存空值,加上过期时间,但不能根治。第二个方法就是布隆过滤器,虽然有一定的误差但效果还是不错的。其原理就是将数据用几个不同的哈希函数得出的结果变成一存储起来。当有数据经过布隆过滤器时,再用刚才的哈希函数对其进行计算,如果所在位置全是1则数据存在,反之直接返回。 缓存击穿是指当某个热点key突然过期时,大量的请求涌入数据库导致数据库崩溃。解决方案第一个是加互斥锁,当发现缓存失效后便尝试获取互斥锁,获取成功则从数据库获取数据并写回缓存中,其他线程则不断自旋如果获取锁后缓存中有值则返回数据,没有则获取数据库。优点是数据一致性强,没有额外的内存消耗。缺点是性能降低,且有死锁风险。第二个方案是逻辑过期,即不真正的设置过期时间,而是将过期时间作为value存入数据中,每次去的时候看一下时间是否过期,如果过期则尝试获取互斥锁,如果成功则另开一个线程从数据库获取数据并写回缓存,自己则会返回旧数据。其他线程尝试获取锁失败后也会直接返回旧数据。优点是性能高,确定就是数据一致性不高,且过期时间的存储占额外内存。 缓存雪崩是指大量热点key同时过期,大量的请求涌入数据库中,造成数据库崩溃。第一个解决办法是加随机的时间,避免大量key同时过期。二是采用熔断机制,若访问的不是核心数据则直接返回空值或错误信息。第三种是构建高可用的redis服务,采用哨兵或集群模式,即使单个节点宕机整体依然高可用。
发表于 2022-10-13 09:58:24
回复(0)
1
M97926
缓存穿透是指大量查询redis层中不存在的key,导致大量查询请求直接请求到数据库层,导致数据库负载过大甚至宕机的情况,解决方案是将这些不存在的key暂时缓存起来,或者使用布隆过滤器过滤。缓存击穿是针对同一热点数据的大量请求在这个热点数据失效的瞬间直接到达数据库层,导致数据库负载过大崩溃的情况,解决方法时设置热点数据永不过期或者加互斥锁,缓存雪崩,大量热点数据同时过期,解决方案: 将失效时间分散。
发表于 2022-09-16 23:57:24
回复(0)
1
ganlanA
缓存穿透:客户端查询了根本不存在的数据,使得整个请求直达储存层,导致其负载过大导致宕机 解决方案:储存层未命中后,返回空值进入缓存层,客户端再次访问的时候,缓存层直接返回空值。 缓存击穿:当一份访问量非常大的热点数据缓存失效的瞬间,大量的请求直达储存层,导致服务崩溃。解决方案:设置热点数据永不过期 缓存雪崩:缓存中有大量数据同时过期,导致所有请求直达储存层,导致数据库宕机。解决方案:设置过期时间的时候,加一个随机数,避免大量的Key同时过期
发表于 2022-09-13 15:41:17
回复(0)
1
阐禅
缓存击穿:一份热点数据,在它缓存失效期间,大量的请求直接命中存储层。 解决方法:1.设置热点数据永不过期的策略。2.加互斥锁,在一个请求访问时另一个不能访问,这样,在这个请求访问过后,焕春重建,其他线程就可以访问了。 缓存穿透:某些不存在的数据,被大量的查询访问,缓存层中没有这些数据的缓存,请求就直达存储层,造成宕机。 解决方法:1.返回空对象,存储岑那个未命中时,也将该key的空值返回给缓存层,缓存层会直接返回空对象。2.布隆过滤器:将所有的key都存在过滤器中,在访问缓存层的时候会首先访问过滤器,如果过滤器中不存在者个值,那么直接返回空值。 缓存雪崩:由于某些原因,中间层的缓存层不能提供服务,大量的请求直达数据存储层,导致宕机。 解决方法:1.设置多级缓存,在存储层之前加上一层本地缓存。2.构建高可用的redis缓存,部署多个redis实例,个别不能用,也不至于宕机。3.采取限流和降级措施,当缓存层的请求超过限制时,对其提供降级服务。
发表于 2022-05-07 13:37:39
回复(0)
0
愿offer多多的肱二头肌很野蛮
缓存击穿是大量请求查询缓存和数据库中没有的数据;雪崩是redis中的大量key同时过期,导致大量请求直接打到数据库;穿透是大量请求同一个key,但此时redis中没有,导致数据库压力过大
发表于 2026-03-12 16:36:53
回复(0)
0
小明揾工
缓存穿透:客户端访问不存在的数据 缓存击穿:一份热点数据失效 缓存雪崩:多份热点数据失效
发表于 2026-02-10 15:05:01
回复(0)
0
在攒经验的打工人很不想泡池子
缓存穿透:客户端访问不存在的数据,请求直接到达存储层,导致负载过大。解决方式当请求到达后,返回空值到缓存层,后续请求到达时,直接返回空,将数据写入到布隆过滤器,访问缓存之前,经过过滤,如果请求数据不存在,返回空值 缓存击穿:一个高频访问数据,在数据过期的一瞬间,所有请求直接到达存储层,解决办法:对于热点数据永不过期,或加锁在存储层,当一个线程访问时,另一个线程只能等待,这个线程过去之后,写入缓存层,后续线程请求缓存层 雪崩:大量数据同时过期,请求直达存储层, 解决办法:缓存时间设置随即过期时间,避免同时过期,设置集群,一个宕机,另一个还可以继续使用
发表于 2026-01-26 10:47:07
回复(0)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
Redis
上传者:
real1993
难度:
77条回答
283收藏
2343浏览
热门推荐
相关试题
下面关于Redis中的操作命令,错...
Redis
评论
(5)
下面关于Redis的定义和特点,正...
Redis
评论
(3)
下面关于Redis 6.0版本中的...
Redis
评论
(2)
以下关于性能测试、压力测试、负载测...
软件测试
评论
(1)
小红的数列
数组
动态规划
蚂蚁
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题