Redis缓存穿透击穿以及雪崩

news2024/11/15 17:30:21

5、Reids缓存问题与解决

5.1、背景

Redis作为一种内存性数据库,当查询的数据在redis缓存中时就不需要在到真实的数据库中去查,加快了查询速度和保护了真实数据库的安全,但是同时也引入了一些新的问题,比如查询的数据不在内存和数据库中,同一时间大量的key失效等情况,为此需要解决这些问题,才可以更好的使用redis作为缓存。

5.2、缓存穿透

5.2.1、何为缓存穿透

缓存穿透:简言之就是查询时穿过了缓存,直接在真实的数据库中进行查找,但是真实的数据库中也不存在该数据,此时就造成了缓存穿透。

因为当系统中引入redis 缓存后,一个请求进来后,会先从redis 缓存中查询,缓存有就直接返回,缓存中没有就去真实的数据库中查询,真实的数据库中如果有就会将其丢到缓存中,但是有些key 对应的数据在真实的数据库中并不存在,所以不会把数据丢到缓存中,故每次针对此次key 的请求从缓存中取不到,请求都会压到真实对的数据库,从而可能压垮真实的数据库。有些黑客就是利用缓存穿透来击垮你的数据库,导致业务不能正常运行。
在这里插入图片描述

5.2.2、如何解决

  1. 对空值进行缓存

    如果一个查询返回的数据为空(不管数据库是否存在),我们仍然把这个结果(null)进行缓存,给其设置一个很短的过期时间,最长不超过五分钟.这样可以防止针对同一个无效key的重复查询。

在这里插入图片描述

  1. 设置黑名单

    采用对空值进行缓存来解决缓存穿透时会带来数据的冗余,因为非法的key有很多个,当采用对空值进行缓存来解决穿透时,需要多每个非法key对应的值赋予空值,虽然我们可以设置很短的过期时间,但是还是会浪费内存空间,为了解决这个问题,我们可以利用set集合的特点来设置一个黑名单,即只有不在名单中的key可以继续向后访问,在名单中的key进行拦截。

在这里插入图片描述

  1. 采用布隆过滤器

    布隆过滤器(Bloom Filter )是1970年有布隆提出的,它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。其中0代表不存在,1代表存在,拥有 k 个独立的哈希函数映射 ,通过要判断的字符分别计算出哈希值 ,当 k 个下标获取到的值都为1时,则认为当前字符存在,否则不存在。

    布隆过滤器是一种数据结构,能够高效地判断一个元素是否存在于集合中,可以用来处理缓存穿透问题。将所有可能的有效key都存储在布隆过滤器中,每次请求到来时,先进行判断,如果不在布隆过滤器中,即可直接过滤掉,而无需查询缓存或数据库。

    • 优点:速度非常快,占用空间极少,操作的是机器底层二进制向量。

    • 缺点:有一定的误识别率和删除困难。
      在这里插入图片描述

  2. 实时监控

    当发现redis 的命中率开始急速降低,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制对其提供服务(比如:IP 黑名单

  3. 限流控制

    通过在系统层面实施限流机制,限制单个IP或用户的请求频率,防止频繁发送大量无效请求,从而减轻缓存层和后端服务的压力。

  4. 基础校验

    在业务层进行基础的参数校验,例如对传入参数进行合法性验证,排除掉无效的请求。这样可以在请求到达Redis之前,就能够过滤掉大部分恶意或无效的请求。

5.3、缓存击穿

5.3.1、何为缓存击穿

缓存击穿:简言之就是击穿缓存(Redis),直接访问真实的数据库,给真实的数据库造成了巨大的压力。

缓存击穿的原因,主要是因为热点key同时过期,造成大量请求拿不到缓存中的key,直接将这些请求转发到真实的数据库中,造成数据库崩溃。缓存击穿常常发生在热门数据失效时的短时间窗口。

在这里插入图片描述

5.3.2、如何解决

  1. 预热热点key

    在系统启动时或者在缓存失效之前主动加载热门数据到缓存中,提前进行缓存预热。即提前把热点数据放入缓存中,同时实时监控,这样可以保证缓存中始终存在热门的数据,减少缓存击穿的可能性。

  2. 适当调整热点key的过期时间

    可以在设置缓存过期时间时,增加一定的随机性。这样可以让缓存在不同的时间点失效,减少大量缓存同时失效的概率

  3. 热点数据隔离

    我们可以将热门的数据隔离开来,使用不同的缓存实例或集群来存储。这样可以减少热点数据集中在一个缓存节点上的概率,降低缓存击穿的风险

  4. 互斥锁

    在缓存失效的时候,使用互斥锁来防止多个请求同时访问数据库。当一个请求发现缓存失效时,先去获取互斥锁,然后再查询数据库并将结果放入缓存,其他请求在获取到锁之前等待,从而避免了多个请求同时击穿缓存。

  5. 分布式锁

    缓存中拿不到数据的时候,此时不是立即去db中查询,而是去获取分布式锁(比如redis 中的setnx),拿到锁再去db中load数据;没有拿到锁的线程休眠一段时间再重试整个获取数据的方法。

  6. 后台异步更新

    当缓存中的数据即将失效时,立即返回旧的缓存数据,并异步地更新缓存和数据库。这样可以保证用户快速获取到旧的缓存数据,避免因为数据库查询时间较长而导致的缓存击穿。同时,在数据更新完成后,再将新数据放入缓存中。

5.4、缓存雪崩

5.4.1 何为缓存雪崩

缓存雪崩:指的是在某个时间段,缓存中的大量数据同时过期,而此时又有大量的请求到达,导致请求无法命中缓存,需要去请求数据库,从而造成数据库瞬时的压力过大。缓存雪崩往往是由于缓存系统故障、节点宕机或者某些异常情况导致的。

缓存雪崩与缓存击穿的区别在于:前者是大量的key 集中过期,而后者是某个热点key 过期。

在这里插入图片描述

5.4.2、如何解决

  1. key失效时间间隔开

    合理设置缓存的过期时间,避免所有缓存同时失效所导致的数据库压力过载。可以采用随机过期时间、过期时间的分级设置等策略,让缓存的失效时间具有一定的随机性和均匀分布。

  2. 多级缓存

    引入多级缓存架构,将热门数据放置在更靠近应用的缓存层,并采用分层的方式进行缓存数据的存储。可以使用本地缓存(如内存)作为第一级缓存,再结合Redis作为第二级缓存,甚至可以引入更高级的缓存层,如分布式缓存。这样可以在缓存失效时,从更低级的缓存层补充获取数据,减少对后端数据库的直接访问。

  3. 缓存数据分散

    仅仅依靠一个Redis实例来存储所有缓存数据存在单点故障的风险。可以将缓存数据分散到多个Redis实例上,避免单一实例故障导致全部缓存数据不可用。可以使用Redis集群、主从复制等机制实现数据的分散存储和高可用性。

  4. 限流

    通过限制接入系统的请求流量,控制单个时间段内的请求并发量,减轻对缓存和后端系统的压力。可以使用限流算法,如令牌桶、漏桶等来对请求进行限制和平滑处理。

  5. 锁或队列

    用加锁或者队列的方式来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上,不适用高并发情况。

  6. 监控和预警

    建立系统的监控和预警机制,实时监控缓存命中率、缓存过期率等指标,一旦发现异常情况,及时采取措施进行处理。可以借助工具、系统日志、指标监控等手段来实现。

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

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

相关文章

一个人也可以是【大厂】,三年程序员的生活规划心路分享!

自从工作之后,我就经常思考以下这些问题: 还有多久退休?明天可以退休吗?地球什么时候爆炸?我什么时候可以暴富辞职?我真的需要这份工作吗? 要问是从什么时候开始有这些问题的,大概…

Linux环境搭建(一)— 实现ssh连接

Linux环境搭建 一 安装虚拟机1.账号记录,密码root2.权限问题 二 安装ssh1.出错2.误删文件3.安装ifconfig4.安装ssh5.重装ssh6.VI环境不好用7.开放端口8.ssh文件下没有密钥文件9.无法安装ssh 三 连接ssh 写在前面: 使用的是VMware,Ubuntu环境 …

利用这个css属性,你也能轻松实现一个新手引导库

相信大家或多或少都在各种网站上使用过新手引导,当网站提供的功能有点复杂时,这是一个对新手非常友好的功能,可以跟随新手引导一步一步了解网站的各种功能,我们要做的只是点击下一步或者上一步,网站就能滚动到指定位置…

被中文乱码折磨的我在此总结一下编码相关知识

本文大致介绍了三个问题: 常见的字符编码以及他们是如何编码从而被计算机识别的?为什么会有这些字符编码和他们被创建的背景和顺序?常见的乱码问题应该如何防止以及如何解决? 常见的字符编码 ASCII,GB2312&#xff…

(小程序)按钮切换对应展示区域

(小程序)按钮切换对应展示区域 需求&#xff1a;点击按钮切换表格和图表两种展示方式 html <u-button type"primary" size"mini" text"图表" v-if"form.curType table"click"showEcharts"></u-button> <u…

同一个分支maven构建出来的包不一样?

现象 最近发布spring boot项目时遇到了一个奇怪的问题&#xff0c;日志异常信息如下&#xff1a; Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing …

Image Watch 的使用

目录 1、下载地址 2、安装完成 3、调试 1、下载地址 Image Watch - Visual Studio Marketplace 2、安装完成 打开VS&#xff0c;在项目->其他窗口中有image watch选项 3、调试 一直放大图像可以查看详细的色彩值&#xff0c;通道数为3

各省绿色创新效率原始数据+测算(2020-2021)

采用了考虑非期望产出的超效率SBM模型来测量中国各省的绿色创新效率。该数据包括原始数据测算结果&#xff0c;包括人力资本、资本、能源投入&#xff0c;以及技术、经济、生态效益等多个维度的数据。可以帮助研究人员了解中国各省的绿色创新效率情况&#xff0c;揭示不同省份在…

搜索引擎概念解析

搜索引擎概念解析 什么是搜索引擎 MySQL搜索引擎举例 搜索引擎是一种用于在互联网上搜索并呈现相关信息的工具。它通过自动扫描和索引大量网页内容&#xff0c;并根据用户提供的关键词或查询条件&#xff0c;返回与之相关的网页链接和摘要。 当用户在搜索引擎中输入关键词或…

系列二、RocketMQ基本概念 系统架构

一、基本概念 1.1、消息&#xff08;Message&#xff09; 消息是指&#xff0c;消息系统所传输信息的物理载体&#xff0c;生产和消费数据的最小单位&#xff0c;每条消息必须输入一个主题。 1.2、主题&#xff08;Topic&#xff09; Topic表示一类消息的集合&#xff0c;每个…

筑牢三大新型能源基础设施,能源变革的分水岭和路线图

当下面临百年未有之大变局&#xff0c;创新科技密集发生&#xff0c;面对瞬息万变的世界&#xff0c;寻找到一条通往未来的确定性道路&#xff0c;绝对是行稳致远的前置条件。 “双碳战略”持续推进&#xff0c;距离2030“碳达峰”越来越近&#xff0c;能源产业变革的重要性和迫…

【SpringMVC 学习笔记】

SpringMVC 笔记记录 1. SpringMVC 简介2. 入门案例3. 基本配置3.1 xml形式配置3.2 注解形式配置 4. 请求4.1 请求参数4.1.1 普通类型传参4.1.2 实体类类型传参4.1.3 数组和集合类型传参 4.2 类型转换器4.3 请求映射 5. 响应 1. SpringMVC 简介 三层架构 2. 入门案例 3. 基本…

如何建立自己的知识体系?202209

知识太多了&#xff0c;无法全部快速吸收进大脑&#xff0c;需要通过特定的方法、技能&#xff0c;在面对大量知识的情况下&#xff0c;快速梳理&#xff0c;构建自己的知识体系。 学习的目标&#xff0c;不仅仅是记忆知识&#xff0c;而是搜索知识、并过滤、洞察、理解、使用…

Spring Boot 整合视图层技术 Thymeleaf

大家好&#xff01;我是今越。简单记录一下在 Spring Boot 框架中如何整合 Thymeleaf 及使用。 Thymeleaf 简介 Thymeleaf 是新一代 Java 模板引擎&#xff0c;它类似于 Velocity、FreeMarker 等传统 Java 模板引擎&#xff0c;但是与传统 Java 模板引擎不同的是&#xff0c;T…

爆肝整理,App测试小技巧,全覆盖功能到性能测试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 app测试是使用手动…

ES查询[全网最全免费送付费内容]

ES查询 相关度搜索&#xff0c;需要计算评分 _score 相关度评分用于对搜索结果排序&#xff0c;评分越高则认为其结果和搜索的预期值相关度越高&#xff0c;即越符合搜索预期值。在7.x之前相关度评分默认使用TF/IDF算法计算而来&#xff0c;7.x之后默认为BM25。 源数据&…

Win 10 重装系统(PE方式)

前言&#xff1a; 最近这个笔记本&#xff08;ThinkPad E480&#xff0c;使用了四年左右&#xff09;用起来很卡&#xff0c;经常开机状态时&#xff0c;合上之后&#xff0c;再打开屏幕就卡死了&#xff0c;鼠标和键盘按了都没有反应&#xff0c;无奈之下只能强制按电源关机后…

SpringCloud——Nacos下载

文章目录 nacos简介nacos下载nacos的启动访问nacos nacos简介 Nacos&#xff08;全称为 “Naming and Configuration Service”&#xff09;是阿里巴巴开源的一个用于实现动态服务发现、服务配置和服务元数据管理的项目。它是一个分布式系统的服务基础设施&#xff0c;为云原生…

turtle画春联

import turtle #右边春联 turtle.penup() turtle.goto(100,150) turtle.pendown() turtle.color(red,red) turtle.begin_fill() turtle.forward(50) turtle.right(90) turtle.forward(400) turtle.right(90) turtle.forward(50) turtle.right(90) turtle.forward(400) turtle.e…

【大数据Hive】Hive 窗口函数使用详解

目录 一、前言 二、hive 窗口函数概述 2.1 聚合函数与窗口函数差别 2.1.1 创建一张表 2.1.2 加载数据到表中 2.1.3 sumgroup by普通常规聚合操作 2.1.4 sum窗口函数聚合操作 三、窗口函数 3.1 窗口函数语法 3.2 参数说明 3.2.1 Function(arg1,..., argn) 3.2.2 OV…