redis缓存雪崩、缓存击穿和缓存穿透还傻傻分不清?看这篇就够了

news2025/2/26 15:00:45

前言

关于Redis的高频问题,缓存雪崩、缓存击穿和缓存穿透一定少不了,相信大家在面试中都被问到过类似的问题。为什么这些问题一直热门呢?因为我们在使用Redis缓存时,这些问题都是很容易遇到的。接下来我们就来看看这些问题都是怎么产生的,对应的解决方案都有哪些吧。

缓存雪崩

首先来看看缓存雪崩,缓存雪崩的概念就是:大量的请求没有在Redis缓存中得到处理,从而导致请求都涌入到数据库中,然后数据库的压力剧增。

引起缓存雪崩的原因可总结为2个:

  • 缓存中有大量的数据同时过期,这样此时大量的请求都怼到数据库了。
  • Redis缓存实例发生故障了,无法处理大量请求,也会导致请求都跑到数据库去了。

先来看看第一个场景:缓存中大量的数据同时过期问题。

缓存中大量的数据同时过期

结合图例来看,就是大量的数据在同一时间过期,然后此时又有很多的请求要读取这些数据。当然就会发生缓存雪崩,从而导致数据库压力剧增了。

大量数据同时过期的解决方案

应对大量数据同时过期问题,通常有2种方案:

  • 数据过期设置增加随机时间:也就是用expire命令给数据设置过期时间时,增加一个随机的时间,比如数据a是5分钟过期,在5分钟的基础上随机增加10-120秒时间。这样就能避免大量数据同时过期。
  • 服务降级:也就是发生缓存雪崩时,(1)若访问的不是核心数据,当没有缓存命中时,不去数据库了,直接返回预先设置好的信息,比如空值或者错误信息;(2)当访问的是核心数据,缓存未命中时,允许去数据库查询。这样就将不是核心数据的请求都拒绝怼到数据库了。

看完了大量数据同时过期的情况,再来看看Redis缓存实例故障的情况。

Redis缓存实例故障导致的缓存雪崩

这种情况下,Redis无法处理读请求了,请求自然就怼到数据库了。

通常来说,应对这种情况,我们也有2种方式:

  • 在业务系统中做好服务熔断/请求限流
  • 事前预防:构建Redis高可靠集群,比如主从集群的主备切换。

服务熔断,也就是当Redis发生故障时,暂停请求对缓存系统的访问。等到Redis恢复正常了再打开请求访问。

这种方式我们需要对Redis或数据库的运行状态进行监控,比如MySQL的负载压力、Redis的CPU使用率、内存使用率及QPS等。当发现Redis实例缓存雪崩了,就暂停服务。

这种情况能有效放置大量请求对数据库造成压力。但是会暂停请求访问,对业务端的影响很大。

因此,为了减少对业务端的影响,我们可以使用请求限流方式,控制QPS,避免过多的请求怼到数据库去。比如下面图例,本身有2万每秒的请求,但因为Redis故障宕机了。我们限流操作将qps降到2千每秒,数据库处理2000的qps还是没问题的。

缓存击穿

缓存击穿就是指个别访问频繁的热点数据无法缓存命中,然后请求都涌入到数据库中。它经常会在热点数据过期时发生。

对于缓存击穿问题,我们知道这些都是被访问非常频繁的热点数据,处理方式就简单粗暴了,直接不设置过期时间了。等热点数据不频繁访问再手动处理即可。

缓存穿透

缓存雪崩有些特别,它是指要访问的数据既不在Redis缓存,也不在数据库中。当大量请求进到系统时,Redis和数据库都会有巨大压力。

导致缓存穿透的原因通常有2种:

  • 数据被误删除了,导致缓存和数据库都没有数据了。然而客户端是不知道的,还在疯狂请求。
  • 有恶意攻击的情况:也就是被人盯上了,专门去查没有的数据。

对于缓存穿透的情况,解决方案可以参考下面几种:

  • 是对缓存设置空值或者默认值。 比如发生缓存穿透时,在Redis缓存中设置空值/默认值。后续查询该值时就直接返回这个默认值了。
  • 使用布隆过滤器来判断数据是否存在,避免从数据库查询。
  • 在前端就进行请求检测。 比如在前端将一些不合法的请求直接过滤,不要发到后端来处理。

第一点和第三点比较容易理解,这里就不展开描述。我们重点来看看第二点:布隆过滤器。

布隆过滤器

布隆过滤器主要用于判断一个元素是否在一个集合中。它是由一个固定大小的二进制向量(可理解成默认为0的bit数组)和一系列的映射函数组成的。

我们首先来看看布隆过滤器是如何标记一个数据a的:

  • 第一步,会使用到多个映射函数(哈希函数),每个函数都会计算这个数据a的哈希值;
  • 第二步,这些计算得出的哈希值会分别对bit数组长度取模,这样就得到每个哈希值在数组上的位置;
  • 第三步,把第二步得到的位置,分别在bit数组上设置为1。

通过这3个步骤,数据标记就完成了。然后要查询数据在不在的时候是这样做的:

  • 先计算这个数据在bit数组中的多个位置;
  • 然后分别查看bit数组的这些位置的bit值。只有每个位置的bit值都为1,说明数据才可能存在,否则数据一定不存在。

结合下图来看,基本原理就是这样。

小结

本文总结了Redis缓存雪崩、缓存击穿和缓存穿透问题的原因及解决方案。熟悉这些问题的细节和方案,能帮助我们尽可能避免及快速解决响应问题。

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

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

相关文章

【附源码】Python计算机毕业设计网上宠物店预约系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Excel打开第二个文件很慢的解决方法

简介: 该问题具体表现为:打开第一个Excel文件后,在不关闭它的情况下接着打开第二个Excel文件,第二个Excel文件会延迟几秒之后才会正常打开。 注意前提是第一个Excel文件打开速度是正常的,否则本解决方案大概率对你无效…

Allegro分Partition操作指导

Allegro分Partition操作指导 Allegro支持多人协同操作,可以将版本分割成很多个部分,让多人操作,具体操作步骤如下 Change editor 选择Team Design,点击OK 点击place design Partition,选择Create Patitions 空白的地方右击选择 ADD Rectangle 选择需要分割的区域 除…

可观测性-可视化-Grafana热图Heatmap

文章目录可观测性-可视化-Grafana热图Heatmap前言选项可观测性-可视化-Grafana热图Heatmap 前言 Heatmap(热图)的用途,在Grafana官网是这样描述的:使用热图,将允许您查看随时间变化的直方图。 所以要使用热图的前提…

数据类型优化

schema与数据类型优化 数据类型优化原则 最小数据类型 尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存。 更简单的数据类型 简单数据类型的操作通常需要更少的CPU周期 1.整型比字符操作代…

全球10大智慧港口介绍

智慧港口,包括数字化和利益相关者深切关注的港口,正在改变海运和航运业的未来。商业活动不断变化,人工智慧、物联网、大数据、区块链和 5G 等智慧技术正在推动全球港口创新。 为了举例说明是什么让港口变得「聪明」,我们决定寻找…

HTML知识点总结篇(一)

src和href的区别 作用结果不同 src用于替换当前内容href用于在引用资源和当前文档之间建立链接 请求资源类型不同 在请求src资源时,会将其指向的资源下载并应用到文档中。常用于img/iframe/input/style/scripthref常用于建立当前元素和文档之间的链接。常用的有lin…

CVPR‘23投稿量再创新高? CCF会议投稿量大比拼, 谁才是卷王?

根据轻松参会CVPR2023交流群群友的反馈,CVPR2023初步统计有效投稿数为9155(不含desk reject),投稿数再创历史新高。 尼谟统计了300余个CCF推荐会议共计3900多条数据,想看看CCF推荐会议投稿量的横向和纵向比较结果&…

【三维重建】逝去的摄影测量知识开始攻击我

这两天为了一个小汇报搞得突击。 由于认真突击了n小时,所以上课听得也认真。外加这老师讲得蛮清楚的,所以整理个笔记。 图像三维重建的思路: #mermaid-svg-eHesMcLx7T5QNnbQ {font-family:"trebuchet ms",verdana,arial,sans-serif…

【渝偲】DSPE-PEG-Galactose;DSPE-PEG-半乳糖;磷脂聚乙二醇半乳糖 长循环脂质体

中文名称:磷脂-聚乙二醇-半乳糖 半乳糖-聚乙二醇-磷脂 简称:DSPE-PEG-Galactose Galactose-PEG-DSPE 外观: 根据不同的分子量为半固体或固体 分子量(PEG ):1000、2000、3400、5000,其他分子量可以定制。 …

酒业迷茫期,江小白凭什么获十亿融资?

凭借抢占年轻人白酒市场而取得市场突破的江小白,在成立十年的关口也开始了新的动作。10月28日,重庆江津区政府宣布对江小白旗下“江记酒庄”进行10亿元战略投资。 江小白在白酒市场已经拥有很强的影响力,但是近几年因为线下消费受限&#xf…

【EC200U】GPS定位

EC200U GPS定位GNSS模块quecgnss - 内置GNSSGNSS 功能初始化GNSS 工作状态获取GNSS开关GNSS定位数据获取实测案例拓展当前互联网地图的坐标系现状地球坐标 (WGS84)火星坐标 (GCJ-02)也叫国测局坐标系百度坐标 (BD-09)coordtransform 坐标转换EC系列东西很多,网上资料…

微信扫码授权登录手游(你使用的浏览器暂不支持微信登录)

这个问题是因为微信服务器会校验请求是否有特定的请求头。 解决这个问题,需要在请求时加上如下请求头: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 NetType/WIFI MicroMessenger…

SpringBoot自定义参数解析器HandlerMethodArgumentResolver(解析ip)

演示 自定义Ip注解,获取请求的ip 原理 DispatcherServlet初始化的时候会初始组件RequestMappingHandlerMapping与RequestMappingHandlerAdapter 1、RequestMappingHandlerMapping组件 RequestMappingHandlerMapping 初始化时,会收集所有 RequestMapp…

Python异常、模块与包

目录 1. 异常 1.1 了解异常 1.2 捕获异常 1.3 异常的传递 2. 模块 2.1 模块的概念与导入 2.2 自定义模块与导入 2.3 自定义Python包 2.4 第三方包 2.5 综合案例 1. 异常 1.1 了解异常 异常就是程序运行的过程中出现了错误。 bug就是指异常的意思,因为历…

记录C文件到可执行二进制文件的经历过程

正常情况下&#xff0c;C代码写完后在Linux系统下直接通过gcc命令编译成可执行文件&#xff0c;即 #include <stdio.h>int main() {printf("hello, world!\n");return 0; }编译&#xff1a; gcc hello.c -o hello运行&#xff1a; ./hello结果&#xff1a; …

Linux系统中Makefile的基本实现

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;Linux系统中的Makefile的使用方法。 第一&#xff1a;Makefile基本简介 当文件有几十、上百甚至上万个的时候用终端输入 GCC 命令的方法显然是不现实的。如果我们能够编写一个文件&#xff0c;这个文件描述了编译哪些源码文…

「避坑宝典」为大家分享笔者在22 年所遇到“匪夷所思”的 Bug 趣事

“BUG”的你咋又来了&#xff1f; 无论这一年我们遇到了什么困难或者是喜事&#xff0c;在此时此刻&#xff0c;个人觉得都应该反思或者回味一下这些事情&#xff0c;对于好事&#xff0c;我们欣慰开心&#xff1b;坏事那我们能做到的就是极力避免它们再次发生&#xff0c;就如…

Python复习知识点(三)

循环结构 一&#xff0c;while循环 使用方式和之前学的一致&#xff0c;这里只说新加入的 while...else 当while语句条件为false时候执行else (else和while平级) 二&#xff0c;for循环 和之前的有差别&#xff0c;它支持序列和迭代器作为参数 简单用法&#xff1a; 新增…

【JavaWeb】EL表达式JSTL标签库

文章目录一.EL表达式⭐️1.EL表达式概念及作用2.EL表达式搜索域数据的顺序3.EL表达式输出Bean的普通属性,数组属性,List集合属性,map集合属性4.EL表达式运算5.EL表达式的11个隐含对象二.JSTL标签库⭐️1.JSTL标签库的使用步骤2.core核心库使用一.EL表达式⭐️ 1.EL表达式概念及…