【Redis29】Redis进阶:缓存穿透、击穿与雪崩

news2025/2/8 11:28:35

Redis进阶:缓存穿透、击穿与雪崩

其实啊,这个内容本来不打算写了,网上讲这一块的内容实在是太多了。不过呢,本着学习还是要全面的原则,而且还要让自己多多巩固复习的原则,咱还是来写一道吧。

同样的,这三个问题也是面试中的经典问题,而且是面向整个缓存机制的,不仅是 Redis 的问题,即使你用 Memcached 、ETCD、或者 SWOOLE 中的 TABLE 之类的,也会有这样的问题。

缓存场景

大部分情况下,我们的缓存过程可能是这样的。

76527e79b9466d9af809855c4ab3f884.jpeg

请求过来后先看 Redis 中有没有数据,有的话直接返回数据,没有的话去 MySQL 查询,然后 MySQL 返回数据并同时更新 Redis 中缓存的数据。

在后台操作数据时,我们也需要更新数据,大概的流程如下图。

03573ecf1b238562f44463284ca89179.jpeg

这是最简单的两种缓存操作形式,相信也是大部分同学在实际的业务开发中所使用的缓存方案。这种方案也只做只读缓存。写缓存是发生在读未得到数据后出现的,后台操作只是删除掉缓存,全部交由前端来更新缓存。另外还有读写缓存,其中又包括同步直写和异步回写两种,分别是更新缓存时同时更新数据库,以及先更新缓存再异步更新数据库。读写缓存会有缓存系统崩溃导致数据库写入失败的风险,但在某些场景下还是很重要的,比如强事务性缓存、对数据库依赖不高的缓存业务等。

好了,穿透、击穿、雪崩的问题恰恰就是发生在这些更新删除的中间步骤和环节之中,说白了,就是缓存和数据库不一致或者在准备一致的过程中,会出现的问题。当然,也是在高并发大流量的场景下才容易出现,所以其实很多小伙伴也只是听说过,但实际的业务场景中说实话,真的处理过类似问题的不多,包括我在内。别急,没吃过猪肉至少咱也得想办法去看猪跑是不是,管它三七二十一,问题原因和解决方案不说完美,但面试的时候至少要能答个八九不离十,大不了硬背嘛。

缓存穿透

缓存穿透可能会相对常见一点,因为它和并发量关系不大,只是说在高并发场景下会更明显,但实际上,这个问题可能很多情况下是一直存在的。

穿透的意思就是从缓存层直接穿过去到达数据库了,说白了,Redis 中没有缓存的数据。而且注意了,它和击穿的最大不同是,数据库中也没有这条数据。

比如说,我们的用户表只有 10000 条数据,而对方一直请求 100001 这个 id 的数据,那么这个请求会一直落到 MySQL 上去进行一次查询。

正常情况下,查不到数据我们就不会缓存,比如像下面这样。

$uid = $request->param("id", 0);
$info = Db::find($uid);
if ($info){
  $redis->set("user:".$uid, json_encode($info));
}

很明显,没有查到的数据不会缓存,对方只需要一直请求这些查不到数据的信息,然后加大请求量,就会给数据库带来不小的压力。

解决方案?最简单的方式,空数据也缓存一下。

$uid = $request->param("id", 0);
$info = $redis->get("user:" . $uid);
if (!$info) {
  $info = Db::find($uid);
  if ($info) {
    $redis->set("user:" . $uid, json_encode($info));
  } else {
    $redis->set("user:" . $uid, "noone", 2 * 60);
  }
} else {
  if ($info == "noone") {
    // 返回错误信息
  }
}

我们给一个 noone 或者一个空的结构化数据都可以,要注意的是可以给一个较短的过期时间,避免真的有数据了之后还查不到。当然,后台在操作数据的时候也应该对应的删除或者更新这条缓存 Key 。

不过这个方案有不好的地方。一是浪费内存空间,二是万一更新失败,数据会出现问题。因此,更高大上的解决方案是 布隆过滤器 关于这个东西,之前在讲 Bitmap 时就顺带讲了一句,如果是像用户 ID 这样纯数字的,确实直接可以用 Bitmap 来实现,否则的话,就要考虑 Redis 的布隆过滤器插件或者我们自己手动准备一个了。这一块大家可以再查找更详细的资料,毕竟我也没实际使用过。

缓存击穿

缓存击穿,看着和穿透好像有点关系吧?但其实它和雪崩有点关系,和穿透的关系不大。击穿指的是热点数据过期,在缓存更新或者删除的空档,大量请求到达数据库,从而发生数据库被击穿的情况。

同样地,大流量高并发的场景下才会见到。另外,还有一点,就是 Redis 中的数据没了,但数据库里是有数据的。只是在两边数据未同步的那个间隙产生出来的问题。

一般来说,大家经常会访问的数据被称为热点数据,然后在秒杀、抢优惠券这类的大流量高并发场景下,突然一个热点缓存过期或者更新了,就很容易出现击穿问题。非热点数据由于访问频次不高,所以击穿问题即使出现,后果也不会太严重。

那么怎么应对呢?

  • 双缓存:另起一个缓存实例或者另加一个 Key ,保存的数据全部是不过期的。操作数据时也先更新第一层缓存,然后再更新第二层缓存。读取的时候,第一层缓存失效后先读第二层缓存,同时去数据库查询新数据并更新。可能出现数据不一致。

  • 后台更新缓存,而不是删除缓存让前台去更新。非热点数据可能会占用更多的内存。对应读写缓存中的同步直写方式,需要注意事务关系,也就是数据库操作或缓存操作某一个失败后的处理。

  • 热点数据别过期,业务上控制也尽量别更新。

  • 锁:缓存失效前台在获取的时候上锁,更新完成后释放锁,锁内部还需要再查一次缓存中是否已经有数据,会造成其它请求等待。性能降低。

各种方案各种优势和弊端,如何取舍只能根据业务情况具体分析了。

缓存雪崩

雪崩了啊,山崩地裂的感觉。很明显,同一时间内大量缓存同时过期。这个时候如果都失效的是非热点数据还好,但如果其中夹杂着热点数据,那其实就是发生了大规模的击穿。大量击穿换个名词,就变成了缓存雪崩。

既然知道问题原因了,那么解决方案也呼之欲出了。

  • 最简单的方式,所有过期时间加上随机因子,比如正常是缓存 2 小时的,加个随机数 1-300秒,就变成了 2 小时 1 秒至 5 分钟内随机过期。

  • 后台更新缓存,和上面击穿的一样。

  • 热点数据别过期。

  • 锁。

  • 服务熔断、降级、请求限流。

总结

其实了解了概念,这些内容的解决方案都不是特别复杂的。另外,这三个问题都有一个特点,那就是在大流量高并发的场景,因为 MySQL 抗不住了才会出现问题。因此,小流量低并发的系统比如后台的管理系统之类的,其实并不太需要考虑这些问题。另外,这三个问题都是缓存和数据库的数据出现了不一致,也就是数据双写出现了问题,因此,它们的终极解决方案都是加锁,将并行变成串行,而加锁就会降低并发性。两难啊,就像文章中说到的,怎么抉择,看大家自己的业务情况按需选择吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/640874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

把钢铁侠战衣交给Z世代,没想到联想商用PC可以这么炫酷!

在数字化转型成为全球政企战略性与常态化诉求的今天,没有人会怀疑新一代数字技术和工具的重要性。 千行百业需要拥有全新的工具握力,也带动了商用 PC的市场需求不断被激发,产品升级迭代速度加快,成为PC行业最具发展机遇的市场。 从…

【Python】Python进阶系列教程--Python AI 绘画(二十)

文章目录 前言Windows 环境安装Civitai 介绍 前言 往期回顾: Python进阶系列教程-- Python3 正则表达式(一)Python进阶系列教程-- Python3 CGI编程(二)Python进阶系列教程-- Python3 MySQL - mysql-connector 驱动&a…

好几位朋友最近被迫创业!

见字如面,我是军哥! 最近好几位朋友被迫创业,有程序员也有之前做业务的朋友,问其原因,都说现在找工作比较难,想想还是自己干吧。 对于这样的回答, 我表示非常的担心,因为风险实在是太…

VMIX如何RTMP推流给灵派编码器

本文链接:https://blog.csdn.net/weixin_45326556/article/details/131181058 第三方设备(例如vMix,OBS)如何RTMP推流给灵派编码器 1. 灵派编码器内置RTMP-SERVER2. 其他设备RTMP推流给灵派编码器方法3. 如何使用第三方推上来的RT…

Linux---ln命令、date命令

1. 链接命令ln ln(link files)命令的功能是为某一个文件在另外一个位置建立一个同步的链接。 当需要在不同的目录,用到相同的文件时,不需要在每一个目录下都放一个相同的文件,只需要在 某个固定目录,放上…

以正式员工身份从京东出来,又通过外包回去了,不甘心啊!

人生是一个圈,职场也是一个圈,一位京东员工就以实际行动诠释了这个“圈”: 以正式员工身份从京东出来,又通过外包回去了,不甘心啊,但外面找工作是地狱级难度! 网友纷纷表示“笑死”、“有被笑到…

基于最小费用流(MCF)法的相位解包裹理论与实验验证-含Matlab代码

一、引言 最小费用流算法(Minimum cost flow, MCF) 最早是由 Costantini M. A1998 年提出的,该方法是将未解缠相位的相邻梯度差与解缠相位的相邻梯度差间的差异即不连续性最小化,具有极强鲁棒性与准确性,有基于规则与不规则网络之分。2002年…

Python实现ACO蚁群优化算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

Flutter的Stack和Positioned的控件

简介 Flutter中的Stack控件是一种可用于将多个子控件重叠在一起的布局控件。Stack将所有子控件放在同一个位置,它们可以根据需要进行定位、缩放或旋转。Stack中的子控件可以是任何类型的控件,例如文本、图像、按钮等。 主要属性 Stack控件的主要属性包…

Qcom Camera HAL 流程详解

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、概览二、基本组件概念三、组件结构关系四、关键流程详解 一、概览 回顾高通平台Camera HAL历史,之前高通采用的是QCamera & MM-Cam…

chatgpt赋能python:Python并列输出——让你的数据展示更加美观

Python并列输出——让你的数据展示更加美观 在数据分析和机器学习中,输出数据的格式和展示方式都十分重要。而对于Python程序员来说,如何实现并列输出是一个必须掌握的技能。本文将向您介绍Python的并列输出方式,并教您如何将其结合使用&…

SpringBoot项目实战:自定义异常和统一参数验证(附源码)

你好,我是田哥 在实际开发过程中,不可避免的是需要处理各种异常,异常处理方法随处可见,所以代码中就会出现大量的try {...} catch {...} finally {...} 代码块,不仅会造成大量的冗余代码,而且还影响代码的可…

如何将一个实例的内存二进制内容读出来?

一、读取实例在内存中的字节 如下所示的PrintBytes<T>会将指定实例在内存中的字节输出到控制台上。如代码片段所示&#xff0c;我们先调用《如何计算一个实例占用多少内存&#xff1f;》中定义了SizeCalculator将承载实例内容的字节数计算出来&#xff0c;并创建对应长度…

阅读理解解题思路汇总

阅读理解解题思路汇总 一、规范解题流程&#xff1a; 1&#xff0e;读题&#xff1a; &#xff08;1&#xff09;论据→证明→论点&#xff1b; &#xff08;2&#xff09;题号&#xff1a;命题顺序与行文顺序一致&#xff1b; &#xff08;3&#xff09;题干&#xff1a;找可定…

居然生成这样的答案,AI简直离了大谱...

前文介绍了我认为目前最强的AI工具Claude&#xff1a; &#xff08;1&#xff09;目前最强的内容生成能力&#xff1b; &#xff08;2&#xff09;目前最强的个性化能力&#xff1b; &#xff08;3&#xff09;目前最强的上下文关联能力&#xff1b; &#xff08;4&#xff09;…

岩土工程中振弦采集仪的完整解决方案分析

振弦采集仪是岩土工程中用于测量地震波传播速度和土层结构信息的重要仪器。其完整解决方案包括以下几个方面&#xff1a; 1. 仪器选择&#xff1a;要选择合适的振弦采集仪&#xff0c;需要考虑测量范围、精度、可靠性、操作简便等因素。市场上常见的振弦采集仪品牌有多种&#…

chatgpt赋能python:Python并行处理介绍

Python并行处理介绍 Python是一种高级编程语言&#xff0c;通常用于数据分析&#xff0c;人工智能&#xff0c;机器学习等领域。随着数据量的增加和计算要求的增加&#xff0c;使用单个Python线程可能会变得不够快。在这种情况下&#xff0c;我们需要并行处理&#xff0c;以在…

职场上除了「躺」与「卷」,是否有第三种选择存在?

大家好&#xff0c;我是校长。 昨天在知乎上看到一个问题&#xff1a;职场上除了「躺」与「卷」&#xff0c;是否有第三种选择存在&#xff1f; 当我看到这个问题的时候&#xff0c;我想到了两本书&#xff0c;以及我看到的一些最新的观点&#xff0c;我试图结合我看到的书以及…

淘宝拍照基于端云协同的视频流实时搜索实践

本文介绍了实时视频流的主体识别场景&#xff0c;未来实时搜将会融合图搜主链路并在XR场景发力&#xff0c;未来的场景我们取名为“元视界”&#xff08;MetaSight&#xff09; 引言 很多熟悉淘宝的用户知道&#xff0c;点击首页搜索框的相机icon&#xff0c;就可以使用淘宝拍照…

助力长城汽车数据管道平台连接“数据孤岛”,加强数据一元化,Apache DolphinScheduler 的角色定位...

点击蓝字 关注我们 讲师简介 长城汽车-IDC-数据中台部-刘永飞 高级工程师 我是长城汽车 IDC-数据中台部的刘永飞&#xff0c;给大家分享一下我们自研的一个数据同步工具平台&#xff0c;以及在使用这个工具过程中遇到的问题。今天的分享主要有四个部分&#xff1a; 1. 我们自研…