返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Redis击穿穿透雪崩产生原因分析及解决思路面试
  • 107
分享到

Redis击穿穿透雪崩产生原因分析及解决思路面试

2024-04-02 19:04:59 107人浏览 泡泡鱼
摘要

目录1、前言2、问题起因 3、应对击穿的处理思路4、穿透 5、雪崩 结束1、前言 大家都知道,计算机的瓶颈之一就是io,为了解决内存与磁盘速度不匹配的问

1、前言

大家都知道,计算机的瓶颈之一就是io,为了解决内存与磁盘速度不匹配的问题,产生了缓存,将一些热点数据放在内存中,随用随取,降低连接到数据库的请求链接,避免数据库挂掉。需要注意的是,无论是击穿还是后面谈到的穿透与雪崩,都是在高并发前提下,比如当缓存中某一个热点key失效。

图片

2、问题起因 

有两个主要原因:

  • 1、Key过期;
  • 2、Key被页面置换淘汰。

对于第一个原因是因为在Redis中,Key有过期时间,如果某一个时刻(假如商城做活动,零点开始)key失效,那么零点之后对某一个商品查询请求将全都压到数据库上,导致数据库崩。

对于第二个原因,因为内存是有限的,要时时刻刻缓存新的数据,淘汰旧的数据,所以在一定的页面置换策略(常见页面置换算法图解)中,淘汰数据,如果某些商品做活动之前无人问津,势必会被淘汰。

3、应对击穿的处理思路

正常的处理请求如图:

图片

由于key过期在所难免,高流量来到Redis时,根据Redis的单线程特性,可以认为任务是在队列里依次执行的,当请求到达Redis发现Key过期时,进行一个操作:设置

这个流程大概如下:

  • 请求到达Redis,发现Redis Key过期,查看有没有锁,没有锁的话回到队列后面排队
  • 设置锁,注意,这儿应该是setnx(),而不是set(),因为可能有其他线程已经设置锁了
  • 获取锁,拿到锁了就去数据库取数据,请求返回后释放锁。

图片

 但是引出了一个新的问题,如果拿到锁去拿数据的请求然后挂了怎么办?也就是锁没有释放,其他进程都在等锁,解决办法是:

对锁设置一个过期时间,如果到达了过期时间还没释放就自动释放,问题又来了,锁挂了好说,但是如果是锁超时呢?也就是在设定的时间里数据没有取出来,但是锁由过期了,常见的思路是,锁过期时间值递增,但是想想不靠谱,因为第一个请求可能超时,如果后面的也超时呢,接连多次超时之后,锁过期时间值势必特别大了,这样做弊端太多。

另外一个思路是,再开启一个线程,进行监控,如果取数据的线程没有挂的话,就适当延迟锁的过期时间。

图片

4、穿透 

穿透主要原因是很多请求都在访问数据库不存在的数据,例如一个卖书的商城一直被请求查询茶叶产品,由于Redis缓存主要是用来缓存热点数据,对于数据库都不存在的数据,是没法缓存的,这种异常流量就会直接到达数据库并且返回"没有"的查询结果。

应对这种请求,处理办法是对访问请求加一层过滤器,例如布隆过滤器、增强版布隆过滤器、布谷鸟过滤器。

图片

除了布隆过滤器,可以增加一些参数检验,例如数据库数据id一般都是递增的,如果请求 id = -10 这种参数,势必绕过Redis,避免这种情况,可以对用户真实性检验等操作。

5、雪崩 

雪崩,和击穿类似,不同的是击穿是一个热点Key某时刻失效,而雪崩是大量的热点Key在一瞬间失效,网络上很多博客都在强调解决雪崩的策略是随机过期时间,这个非常不准确,举个例子,银行做活动,之前这个利息系数为2%,过了零点系数改为3%,这种情况能将用户的对应的key改为随机过期吗?如果用的过去的数据叫脏数据。

明显不可以,同样存钱f0c;你存到年底利息300万,隔壁才200万,这不得打架啊,开玩笑~

正确的思路是,首先要看看这个Key过期是不是时点性有关,时点性无关的话,可以随机过期时间解决。

如果是时点性有关,例如刚刚说的银行某一天改变某系数,那么就要利用强依赖击穿方案,策略是先过去的线程更新一下所有key。

图片

在后台更新热点key的同时,业务层将进来的请求延时一下,例如短暂的睡几毫秒或者秒,给后面的更新热点key分散压力。

结束

以上就是Redis击穿穿透雪崩产生原因及解决思路面试的详细内容,更多关于Redis击穿穿透雪崩解决的资料请关注编程网其它相关文章!

--结束END--

本文标题: Redis击穿穿透雪崩产生原因分析及解决思路面试

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

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

猜你喜欢
  • Redis击穿穿透雪崩产生原因分析及解决思路面试
    目录1、前言2、问题起因 3、应对击穿的处理思路4、穿透 5、雪崩 结束1、前言 大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问...
    99+
    2024-04-02
  • Redis击穿穿透雪崩产生原因是什么及怎么解决
    本篇内容主要讲解“Redis击穿穿透雪崩产生原因是什么及怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis击穿穿透雪崩产生原因是什么及怎么解决”吧!1、前言大家都知道,计算机的瓶颈...
    99+
    2023-06-29
  • 详解Redis缓存穿透/击穿/雪崩原理及其解决方案
    目录1. 简介2. 缓存穿透2.1描述2.2 解决方案3. 缓存击穿3.1 描述3.2 解决方案4. 缓存雪崩4.1 描述4.1 解决方案5. 布隆过滤器5.1 描述5.2 数据结构...
    99+
    2024-04-02
  • 缓存穿透,缓存击穿,缓存雪崩解决方案分析
    阅读本文大概需要 3.7 分钟。一、前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。二、缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则...
    99+
    2023-06-05
  • Redis缓存一致性、缓存穿透、缓存击穿及缓存雪崩问题分析
    本篇内容介绍了“Redis缓存一致性、缓存穿透、缓存击穿及缓存雪崩问题分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,...
    99+
    2024-04-02
  • 详解Java redis中缓存穿透 缓存击穿 雪崩三种现象以及解决方法
    目录前言一、缓存穿透二、缓存击穿三、雪崩现象总结前言 本文主要阐述redis中的三种现象 1.缓存穿透 2.缓存击穿 3.雪崩现象 本文主要说明本人对三种情况的理解,如果需要知道re...
    99+
    2024-04-02
  • 如何设计缓存系统:缓存穿透,缓存击穿,缓存雪崩解决方案分析
    来源:zeb_perfect前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,...
    99+
    2023-06-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作