缓存雪崩、击穿、穿透_解决方案

news2025/1/19 17:00:15

在这里插入图片描述

文章目录

  • 缓存雪崩、击穿、穿透
    • 1.缓存雪崩
      • 造成缓存雪崩
        • 解决缓存雪崩
    • 2. 缓存击穿
      • 造成缓存击穿
      • 解决缓存击穿
    • 3.缓存穿透
      • 造成缓存穿透
      • 解决缓存穿透

缓存雪崩、击穿、穿透

一般用户数据存储于磁盘,读写速度慢。

使用redis作为缓存,相当于数据缓存在内存,大大提高系统性能

redis作为缓存,就会有缓存异常的三个问题

1.缓存雪崩

在这里插入图片描述

缓存都设置了过期时间

造成缓存雪崩

  • 大量缓存数据在同一时间过期

  • redis故障宕机

    若此时有大量用户请求,无法在redis处理,都直接访问数据库 => 数据库压力骤增(严重造成数据库宕机) => 形成一系列连锁反应 => 整个系统崩溃

解决缓存雪崩

=> 大量缓存数据在同一时间过期时:

  1. 均匀设置过期时间(对缓存数据的过期时间加上随机数,保证数据不会在同一时间过期)

  2. 互斥锁(当业务线程在处理用户请求时,如果发现访问的数据不在redis里,加互斥锁,保证同一时间内只有一个请求来构建缓存(从数据库读取数据,再将数据更新到redis),当缓存构建完成后,再释放锁。)
    注:互斥锁设置超时时间,否则若出现请求发生意外阻塞,导致其他请求也一直拿不到锁

  3. 后台更新缓存(让缓存“永久有效”,将更新缓存的工作交由后台线程定时更新)
    当系统内存紧张时,有些缓存数据被“淘汰”,在“淘汰”和下次更新时间内,业务线程读取失败就以为是数据丢失,解决方法:

    1. 后台线程负责定时更新缓存,同时频繁地检测缓存是否失效,若失效,可进行构建缓存

      ​ 检测时间间隔不能太长,太长导致用户获取的数据是空值而不是真正的数据,检测时间间隔最好是毫秒级,用户体验一般

    2. 业务线程发现缓存数据失效后,通过消息队列发送一条消息通知后台线程更新缓存。后台线程收到消息后,更新前判断缓存是否存在,不存在则进行构建缓存。

      ​ 缓存更新及时,用户体验好

    **注:**后台更新缓存机制适合进行缓存预热(业务刚上线时,提前缓存数据,不是等待用户访问才来触发缓存构建)

=> Redis故障宕机时:

  1. 服务熔断或请求限流机制

    ​ 服务熔断:暂停业务应用对缓存服务的访问,直接返回错误,不再继续访问数据库,直到redis恢复正常。

    ​ 请求限流机制:只将少部分请求发送到数据库进行处理,再多的请求就在入口直接拒绝服务,等到Redis恢复正常 并把缓存预热完后。

  2. 构建redis缓存高可靠集群

    ​ 通过主从节点的方式构建,若redis缓存的主节点宕机,从节点可以切换成为主节点,继续提供缓存服务

2. 缓存击穿

造成缓存击穿

被频繁访问的热点数据过期,此时大量的请求访问该热点数据,直接访问数据库,数据库很容易被高并发的请求冲垮

缓存击穿可以认为是缓存雪崩的一个子集(对应于大量缓存数据在同一时间过期)

解决缓存击穿

  1. 互斥锁
  2. 不给热点数据设置过期时间,由后台异步更新缓存 / 在热点数据准备过期前,提前通知后台线程更新缓存以及重新设置过期时间

3.缓存穿透

对于缓存雪崩、击穿,数据仍然在数据库,一旦缓存恢复相应的数据,就可以减轻数据库的压力

而对于缓存穿透:

​ 用户访问的数据,既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库,发现数据库也没有要访问的数据,没办法构建缓存来服务后续请求。当有大量的这样的请求时,数据库的压力骤增

造成缓存穿透

  • 业务误操作,缓存中数据和数据库数据都被误删除
  • 黑客恶意攻击,故意大量访问某些读取不存在数据的业务

解决缓存穿透

  1. 非法请求的限制

    判断请求参数是否含有非法值?请求字段是否存在?

  2. 缓存空值或默认值

    当线上业务发现缓存穿透时,针对查询的数据,在缓存中设置一个空值或默认值,后续请求可以从缓存中读取到数据,而不会继续查询数据库

  3. 使用布隆过滤器快速判断数据是否存在,避免通过查询数据库来判断数据是否存在。

    写入数据库数据时,使用布隆过滤器做标记,当业务线程确认缓存失效后,可以通过查询布隆过滤器判断数据是否存在。(大量请求只会查询布隆过滤器和redis,而不会查询数据库)

注:布隆过滤器的实现

在这里插入图片描述

设此时有3个哈希函数,位图数组长度为8,数据库写入数据x:

将该数据x得到的三个哈希值 % 位图数据长度得到三个数组下标,填入1。

当业务线程查询数据是否存在于数据库时,查询 1、4、6下标的值是否为1,若有一个为0,则说明不存在

(存在哈希冲突,故若查询布隆过滤器说数据存在于数据库,此时数据不一定在数据库;但是查询到数据不存在时,数据一定不存在)

在这里插入图片描述

小林coding图解Redis — 七

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

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

相关文章

笔记59:序列到序列学习Seq2seq

本地笔记地址:D:\work_file\(4)DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章:动手学深度学习~现代循环神经网络 a a a a a a a a a a a a a a a

HTML实现简易计算器

随便写的&#xff0c;可能有bug&#xff0c;可以在评论区指出哈。 HTML代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>AI简易计算器</title> </head> <body> <table id"c…

JMeter集结点的使用场景以及如何使用?

JMeter是一个开源的负载测试工具&#xff0c;它被广泛用于测试应用程序、Web服务和网络协议等的性能。在JMeter中&#xff0c;集结点&#xff08;JMeter Cluster&#xff09;是一种分布式测试环境&#xff0c;它允许多个JMeter实例同时工作来模拟高并发负载。 使用集结点的场景…

jQuery的学习(一篇文章齐全)

目录 Day29 jQuery 1、jQuery介绍 2、jQuery的选择器 2.1、直接查找 2.2、导航查找 3、jQuery的绑定事件 案例1&#xff1a;绑定取消事件 案例2&#xff1a;模拟事件触发 4、jQuery的操作标签 tab切换案例jQuery版本&#xff1a; 案例1&#xff1a; 案例2&#xff…

virtualbox 扩展磁盘后在win10 虚拟机看不到新扩展的空间

造成标题中问题的原因是&#xff0c;扩展的是win10.vdi 的空间&#xff0c;虚拟机使用使用的下边那个以uuid命名的空间&#xff0c;将这个磁盘的虚拟分配空间也调整到150G . 然后在win10的磁盘管理里就可以看到新加的空间了。之后再点相应的盘进行扩展卷操作即可。

“云浮云福保”暖心回归! 保障升级价格不变,医保个账可为全家缴费!

11月22日&#xff0c;2024年“云浮云福保”项目启动会在广东省云浮市迎宾馆成功举办。记者在会上获悉&#xff0c;“云浮云福保”是在云浮市医疗保障局、云浮市金融工作局、国家金融监督管理总局云浮监管分局指导下&#xff0c;的指导下&#xff0c;由中国人民财产保险股份有限…

12-25v转3.3v高清水下钓鱼摄像头电源供电芯片方案

高清水下钓鱼摄像头电源芯片方案&#xff1a;12-25V转3.3V&#xff0c;支持超宽电压输入范围和30米长线视频放大 在水下钓鱼摄像头设计中&#xff0c;为了实现高清画质和稳定的电源供应&#xff0c;需要一款能够将12-25V转换为3.3V输出的高效电源芯片。这款电源芯片不仅支持高…

【Python大数据笔记_day11_Hadoop进阶之MR和YARNZooKeeper】

MR 单词统计流程 已知文件内容: hadoop hive hadoop spark hive flink hive linux hive mysql ​ input结果: k1(行偏移量) v1(每行文本内容)0 hadoop hive hadoop spark hive 30 flink hive linux hive mysql map结果:k2(split切割后的单词) v2(拼接…

thinkphp文件夹生成zip压缩包

一、准备工作&#xff0c;使用phpinfo()查看有没有zip扩展 <?php echo phpinfo(); ?>Thinkphp使用PHP自带的ZipArchive压缩文件或文件夹 显示enabled 说明已经配置好 如果没有安装扩展的&#xff0c;请参照以下方法&#xff1a; 1、下载对应版本的扩展包&#xff1a…

基于SpringBoot+Vue的体检预约管理系统

基于SpringBootVue的体检预约管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 管理员界面 用户界面 摘要 体检预约管理系统是一种基于Spring Boot…

android11 申请所有文件访问权限

Android 11 引入了强制执行分区存储的限制&#xff0c;导致应用默认不能访问外部文件。 针对以前涉及较多文件的操作&#xff0c;可采用申请所有文件访问权限的方式来解决这一问题&#xff0c;实现方式如下。 &#xff08;虽然这样做安全性低&#xff0c;官方并不推荐这样&…

vue3 使用simplebar【滚动条】

1.下载simplebar-vue npm install simplebar-vue --save2.引入注册 import simplebar from "simplebar-vue"; import simplebar-vue/dist/simplebar.min.css import simplebar-vue/dist/simplebar-vue.jsvue2的版本基础上 【引入注册】 import simplebar from &qu…

头发的方向图(2D和3D)与合成

首先&#xff0c;我们从一个不受光照限制的环境中拍摄一组输入图像&#xff0c;这些图像包含了头发的不同视角和姿态。我们对这些图像进行半自动的分割&#xff0c;将头发从背景中分离出来&#xff0c;然后使用PMVS &#xff0c;一种先进的多视角立体算法&#xff0c;来重建一个…

inux应用开发基础知识——串口应用编程(十一)

前言&#xff1a; 在Linux系统中&#xff0c;串口设备以文件的形式存在&#xff0c;通常位于/dev目录下&#xff0c;如ttyS0、ttyUSB0等。这些设备文件可以用于读取和写入数据。要使用串口设备&#xff0c;需要打开相应的设备文件。在打开串口时&#xff0c;可以使用O_RDWR选项…

YOLOv8-seg改进:重新思考轻量化视觉Transformer中的局部感知CloFormer,提升上下文感知权重来增强局部特征 |2023清华

🚀🚀🚀本文改进:CloFormertAttention利用共享权重和上下文感知权重有效地提取高频局部特征表示 🚀🚀🚀SEAM、MultiSEAM分割物与物相互遮挡、分割小目标性能 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻…

年底了,我劝大家真别轻易离职...

年底了&#xff0c;一些不满现状&#xff0c;被外界的“高薪”“好福利”吸引的人&#xff0c;一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的软件测试…

局域网协议:VLAN技术介绍

文章目录 VLAN概述VLAN的优点VLAN的原理VLAN的配置推荐阅读 VLAN概述 VLAN&#xff08;Virtual Local Area Network虚拟局域网&#xff09;是一种在物理网络基础上划分逻辑上独立的局域网的技术。它允许将网络设备按照逻辑上的需求而非物理位置进行分组&#xff0c;提供更好的…

解决 VSCode 配置远程连接,过程试图写入的管道不存在

解决 VSCode 配置远程连接&#xff0c;过程试图写入的管道不存在

vxe编辑保存表格

业务需求&#xff1a; 1、需要点击编辑时&#xff0c;全部表格显示编辑框&#xff0c;点击保存&#xff0c;全部保存。 2、因为位置问题&#xff0c;产品经理把24小时分成了两行&#xff0c;开发就得分两个表格。列标题是写死的&#xff0c;文字偏移也是写死的&#xff0c;其他…

部署你的第一个应用

&#x1f5d3;️实验环境 OS名称Microsoft Windows 11 家庭中文版系统类型x64-based PCDocker版本Docker version 24.0.6, build ed223bcminikube版本v1.32.0 &#x1f913;FastAPI 构建应用 #基于fastapi快速创建一个项目 rkun1LAPTOP-TUS5FU0D MINGW64 / $ mkdir k8s-appr…