Redis之缓存雪崩、缓存击穿、缓存穿透问题

news2024/11/23 20:16:49

文章目录

  • 前言
  • 一、缓存雪崩
    • 1.1、原因分析
    • 2.2、常用解决方案
  • 二、缓存击穿
    • 2.1、原因分析
    • 2.2、常用解决方案
      • 2.2.1、使用互斥锁
      • 2.2.2、逻辑过期方案
      • 2.3、方案对比
  • 三、缓存穿透
    • 3.1、原因分析
    • 3.2、解决方案
      • 3.2.1、缓存空对象
      • 3.2.3、布隆过滤
      • 3.3、方案对比
  • 总结


前言

本文谈谈Redis缓存雪崩、缓存击穿、缓存穿透问题


一、缓存雪崩

1.1、原因分析

缓存雪崩指的是在同一时间段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大的压力
在这里插入图片描述

2.2、常用解决方案

  • 给不同的Key的TTL添加随机值
  • 利用Redis集群提高服务的可用性
  • 给缓存业务添加降级限流策略
  • 给业务添加多级缓存

二、缓存击穿

2.1、原因分析

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击

逻辑分析:假设线程1在查询缓存之后,本来应该去查询数据库,然后把这个数据重新加载到缓存的,此时只要线程1走完这个逻辑,其他线程就都能从缓存中加载这些数据了,但是假设在线程1没有走完的时候,后续的线程2,线程3,线程4同时过来访问当前这个方法, 那么这些线程都不能从缓存中查询到数据,那么他们就会同一时刻来访问查询缓存,都没查到,接着同一时间去访问数据库,同时的去执行数据库代码,对数据库访问压力过大;
如图:
在这里插入图片描述

2.2、常用解决方案

2.2.1、使用互斥锁

因为锁能实现互斥性。假设线程过来,只能一个人一个人的来访问数据库,从而避免对于数据库访问压力过大,但是这也会影响性能,因为此时会让查询的性能从并行变成串行,所以我们可以采用tryLock方法+double check来解决这样的问题

逻辑分析:
假设现在线程1过来访问,他查询缓存没有命中,但是此时他获得到了锁的资源,那么线程1就会一个人去执行逻辑,假设现在线程2过来,线程2在执行过程中,并没有获得到锁,那么线程2就可以进行到休眠,直到线程1把锁释放后,线程2获得到锁,然后再来执行逻辑,此时就能够从缓存中拿到数据了。
如图:
在这里插入图片描述

2.2.2、逻辑过期方案

方案分析:我们之所以会出现这个缓存击穿问题,主要原因是在于我们对key设置了过期时间,假设我们不设置过期时间,其实就不会有缓存击穿的问题,但是不设置过期时间,这样数据不就一直占用我们内存了吗,我们可以采用逻辑过期方案。我们把过期时间设置在 redis的value中,注意:这个过期时间并不会直接作用于redis,而是我们后续通过逻辑去处理。假设线程1去查询缓存,然后从value中判断出来当前的数据已经过期了,此时线程1去获得互斥锁,那么其他线程会进行阻塞,获得了锁的线程他会开启一个 线程去进行 以前的重构数据
的逻辑,直到新开的线程完成这个逻辑后,才释放锁, 而线程1直接进行返回,假设现在线程3过来访问,由于线程线程2持有着锁,所以线程3无法获得锁,线程3也直接返回数据,只有等到新开的线程2把重建数据构建完后,其他线程才能走返回正确的数据。
这种方案巧妙在于,异步的构建缓存,缺点在于在构建完缓存之前,返回的都是脏数据。
在这里插入图片描述

2.3、方案对比

解决方案优点缺点
互斥锁没有额外的内存消耗、保证一致性、实现简单线程需要等待,性能受影响、可能有死锁的风险
互斥锁线程无需等待,性能较好可能脏读、有额外的内存消耗、实现复杂

三、缓存穿透

3.1、原因分析

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这
些请求都会打到数据库。

3.2、解决方案

3.2.1、缓存空对象

方案分析:当我们客户端访问不存在的数据时,先请求redis,但是此时redis中没有数据,此时会访问到数据库,但是数据库中也没有数据,这个数据穿透了缓存,直击数据库,我们都知道数据库能够承载的并发不如redis这么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会访问到数据库,简单的解决方案就是哪怕这个数据在数据库中也不存在,我们也把这个数据值为null存入到redis中去,这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到缓存了;
原始逻辑图:
在这里插入图片描述 缓存空对象逻辑图:在这里插入图片描述

3.2.3、布隆过滤

方案分析:布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中,假设布隆过滤器判断这个数据不存在,则直接返回;
这种方式优点在于节约内存空间,存在误判,误判原因在于:布隆过滤器走的是哈希思想,只要哈希思想,就可能存在哈希冲突
原始逻辑图:在这里插入图片描述
布隆过滤逻辑图:在这里插入图片描述

3.3、方案对比

解决方案优点缺点
缓存空对象实现简单、维护方便额外的内存消耗、可能造成短期不一致
布隆过滤内存占用较少,没有多余的key实现复杂、可能引发哈希冲突导致误判

总结

简单理解缓存雪崩和缓存击穿的区别就是雪崩是多个key失效或者Redis宕机,而缓存击穿是一个被高并发访问的key失效导致给数据库造成巨大压力,而缓存穿透指的是一个在redis和数据库都不存在的数据被高并发访问而导致给数据库造成压力。

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

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

相关文章

[保研/考研机试] KY110 Prime Number 上海交通大学复试上机题 C++实现

题目链接: Prime Numberhttps://www.nowcoder.com/share/jump/437195121691717713466 描述 Output the k-th prime number. 输入描述: k≤10000 输出描述: The k-th prime number. 示例1 输入: 3 7 输出: …

UDP通信实验、广播与组播、本地套接字

文章目录 流程函数应用广播应用 组播(多播)本地套接字应用 流程 函数 返回值: 成功,返回成功发送的数据长度 失败,-1 返回值: 成功,返回成功接收数据长度 失败,-1 应用 广播 应用 …

分布式数据库的HTAP能统一OLTP和 OLAP吗?

OLAP和OLTP通过ETL衔接。为提升OLAP性能,需在ETL过程进行大量预计算,包括: 数据结构调整业务逻辑处理 好处:可控制OLAP的访问延迟,提升用户体验。但因为要避免抽取数据影响OLTP系统,须在日终的交易低谷期…

brew+nginx配置静态文件服务器

背景 一下子闲下来了,了解的我的人都知道我闲不下来。于是,我在思考COS之后,决定自己整一个本地的OSS,实现静态文件的访问。那么,首屈一指的就是我很熟的nginx。也算是个小复习吧,复习一下nginx代理静态文…

网络安全--awk总结

目录 一、谈谈我对awk的理解 二、常用命令总结 三、awk变量 四、举例说明 一、谈谈我对awk的理解 awk是一种用于文本处理和数据提取的命令行工具,它通过模式匹配和操作来处理输入数据并生成输出。 二、常用命令总结 -F fs:fs指定输入分隔符&#xf…

Labview控制APx(Audio Precision)进行测试测量(五)

驱动程序 VIs如何处理配置设置中的单元 APx500 应用程序具有复杂的控件,具有以下功能: 数值和单位组合在一个控制中(例如,1.000 Vrms ) •值转换为 SI 格式(例如,1.000 mVrms 或 1.000 μVrms) •单位之间的转换发生在控制(例如,V…

数据结构:力扣刷题

题一:旋转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 思路一: 创建reverse()函数传入三个值分别为数组地址,从第几个数组元素开始,结束元素位置; 在r…

FreeRTOS(调度锁,中断锁,任务锁,时间管理)

资料来源于硬件家园:资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 一、调度锁、中断锁,任务锁概念 1、调度锁 调度锁就是 RTOS 提供的调度器开关函数,如果某个任务调用了调度锁开关函数,处于调度锁开和调度锁关之间的代码…

喜报!诚恒科技与赛时达科技达成BI金蝶云星空项目合作

随着全球数字化浪潮轰轰烈烈袭来,仅仅凭借手工处理的方式难以在庞大的数据海洋中精准获取信息、把握市场需求、了解目标用户,为企业创新提供强有力的支持。深圳赛时达科技有限公司(简称赛时达科技)希望通过数字化转型实现从手工处…

在Excel中将数值差距极大的两个序列用对比明显的折线图表示

在Excel中,如果两个数据序列的数值差距太大,用这样的数据序列生成折线图时,折线图会显得过于平缓,趋势对比不明显。如下图: 这时候只要将趋势图设置成双坐标轴,将其中一条趋势线绘制到次坐标轴上&#xff0…

PHP傻瓜也能搭建自己框架

PHP最简单自定义自己的框架(一) PHP最简单自定义自己的框架创建目录结构(二) PHP最简单自定义自己的框架定义常量自动生成目录(三) PHP最简单自定义自己的框架控制器自动加载运行(四&#xf…

算法随笔:图论问题之割点割边

割点 定义 割点的定义:如果一个点被删除之后会导致整个图不再是一个连通图,那么这个顶点就是这个图的割点。举例: 上图中的点2就是一个割点,如果它被删除,则整个图被分为两个连通分量,不再是一个连通图。…

CSS 中的优先级规则是怎样的?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐内联样式(Inline Styles)⭐ID 选择器(ID Selectors)⭐类选择器、属性选择器和伪类选择器(Class, Attribute, and Pseudo-class Selectors)⭐元素选择器和伪元素选择器…

Flink源码之JobMaster启动流程

Flink中Graph转换流程如下: Flink Job提交时各种类型Graph转换流程中,JobGraph是Client端形成StreamGraph后经过Operator Chain优化后形成的,然后提交给JobManager的Restserver,最终转发给JobManager的Dispatcher处理。 Completa…

激活函数总结(五):Shrink系列激活函数补充(HardShrink、SoftShrink、TanhShrink)

激活函数总结(五):Shrink系列激活函数补充 1 引言2 激活函数2.1 HardShrink激活函数2.2 SoftShrink激活函数2.3 TanhShrink激活函数 3. 总结 1 引言 在前面的文章中已经介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swis…

新一代分布式融合存储,数据场景All In One

1、摘要 2023年5月11日,浪潮信息全国巡展广州站正式启航。会上,重磅发布新一代分布式融合存储AS13000G7,其采用极致融合架构设计理念,实现同一套存储满足四种非结构化数据的“All In One”高效融合,数据存力提升300%&a…

机器学习基础之《特征工程(4)—特征降维—案例》

一、探究用户对物品类别的喜好细分 1、找到用户和物品类别的关系 数据如下: (1)order_products__prior.csv:订单与商品信息 字段:order_id,product_id,add_to_cart_order,reordered…

【已解决】mac端 sourceTree 解决remote: HTTP Basic: Access denied报错

又是在一次使用sourcetree拉取或者提交代码时候,遇到了sourcetree报错; 排查了一会,比如查看了SSH keys是否有问题、是否与sourcetree账户状态有问题等等,最终才发现并解决问题 原因: 因为之前公司要求企业gitlab中…

平板选择什么电容笔比较好?ipad手写笔推荐品牌

在现在的生活上,有了iPad平板,一切都变得简单了许多,也让我们的学习以及工作都更加的便利。这其中,电容笔就起到了很大的作用,很多人都不知道,到底要买什么牌子的电容笔?哪些电容笔的性价比比较…

佛祖保佑,永不宕机,永无bug

当我们的程序编译通过,能预防的bug也都预防了,其它的就只能交给天意了。当然请求佛祖的保佑也是必不可少的。 下面是一些常用的保佑图: 佛祖保佑图 ——————————————————————————————————————————…