缓存问题 | 缓存穿透,缓存击穿,缓存雪崩

在这里插入图片描述

缓存穿透

关键字:强调缓存和数据库都没有数据+并发访问
缓存穿透是指数据库和缓存都没有的数据,每次都要经过缓存去访问数据库,大量的请求有可能导致DB宕机。

应对策略:

  1. 使用布隆过滤器(Bloom Filter):布隆过滤器就是一种快速判断元素是否存在的数据结构,它可以在很小的内存占用下,快速判断一个元素是否在一个集合中。将所有可能存在的数据哈希到一个足够大的位数组中,当一个请求过来时,先经过布隆过滤器判断是否存在于缓存中,如果不存在,则直接返回,避免对数据库的查询压力。
  2. 空对象缓存:对于确定不存在的数据,在缓存中也存储一个空对象,表示该数据不存在。当请求访问这些不存在的数据时,直接从缓存中返回空对象,避免每次请求都穿透到数据库层进行查询。
  3. 延迟双判:当一个查询请求穿透缓存到达数据库层后,先在数据库中进行查询,如果数据库中也没有对应的数据,则将这个空结果写入缓存,并设置一个较短的过期时间。这样,下次相同的查询请求就会从缓存中得到空结果,而不会再次穿透到数据库。
  4. 热点数据预加载:对于一些热点数据,在系统启动时或在缓存过期前提前异步加载到缓存中,确保缓存的热点数据一直存在,避免被频繁请求的数据因为缓存过期而导致穿透问题。
  5. 限流策略:针对频繁请求的特定数据,可以设置限流策略,例如使用令牌桶算法或漏桶算法,限制对这些数据的请求频率,减轻数据库的压力。

缓存击穿

关键词:强调单个热点key过期+并发访问
缓存击穿是指数据库有,缓存没有的热点数据,大量请求访问这个缓存不存在的数据,最后请求打到DB可能导致DB宕机。

应对策略:

  1. 设置热点数据的热度时间窗口:对于热点数据,可以设置一个热点时间窗口,在这个时间窗口内,如果一个数据被频繁访问,就将其缓存时间延长,避免频繁刷新缓存导致缓存击穿。
  2. 使用互斥锁或分布式锁:在缓存失效时,只允许一个线程去查询数据库,其他线程等待查询结果。可以使用互斥锁或分布式锁来实现,确保只有一个线程能够查询数据库,其他线程等待结果,避免多个线程同时查询数据库造成数据库压力过大。
  3. 缓存永不过期:对于一些热点数据,可以将其缓存设置为永不过期,或者设置一个很长的过期时间,这样即使缓存失效,也有足够多的时间来刷新缓存,避免缓存击穿。
  4. 异步更新缓存:在缓存失效时,可以异步的去更新缓存,而不是同步的去查询数据库并刷新缓存。这样可以减少对数据库的直接访问,并且不会阻塞其他请求的响应。
  5. 多级缓存架构:使用多级缓存架构,将热点数据分散到多个缓存节点上,避免单一缓存节点发生故障导致整个缓存层崩溃。当某个缓存节点失效时,可以从其他缓存节点或数据库中获取数据。
  6. 熔断机制:当缓存层发生故障或无法正常工作时,可以设置熔断机制,直接访问数据库,保证系统的正常运行。

缓存雪崩

关键词:强调批量key过期+并发访问
缓存雪崩指的是在同一时间段大量的缓存键(key)同时失效,导致大量请求打到数据库,最后请求打到DB可能导致DB宕机。

应对策略:

  1. 使用多级缓存架构:将缓存划分多个层级,每个层级的缓存设置不同的过期时间。例如:将热点数据存储在近期失效的缓存层级,而将非热点数据存储在长期失效的缓存层级。这样即使某一层级的缓存失效,仍然可以从其他层级获取数据,避免所有请求直接访问数据库。
  2. 设置缓存数据的随机过期时间:在设置缓存数据的过期时间时,加上一个随机值,使得不同的缓存数据在过期时刻不一致。这样可以避免大量数据同时过期,减轻数据库负荷。
  3. 分布式锁或互斥锁:在缓存失效时,使用分布式锁或互斥锁来保证只有一个请求可以重新加载缓存。其他请求等待该请求完成后,直接从缓存中读取数据。这样可以避免多个请求同时访问数据库。
  4. 数据预热:在系统启动或非高峰期,提前将热点数据加载到缓存中,预热缓存。这样即使在高并发时,也能通过从缓存中获取到数据,减轻数据库的压力。
  5. 缓存限流:当检测到缓存失效时,可以对请求进行限流处理,限制并发请求的数量。这样可以避免大量请求同时访问数据库,导致数据库负载过大。
  6. 数据库优化:对于缓存雪崩问题,除了缓存层面的应对策略,还可以从数据库层面进行优化,如提升数据库性能、增加数据库的容量等,以应对大量请求导致的数据库压力。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react中优化类名写法(类似与vue的动态class对象方式)

安装和引入方式 npm install classnamesimport classNames form classsnames//render 方法中,需要动态className的地方直接参照上图使用

基于 java+springboot+mybatis电影售票网站管理系统前台+后台设计和实现

基于 javaspringbootmybatis电影售票网站管理系统前台后台设计和实现 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承…

数学建模-------误差来源以及误差分析

绝对误差:精确值-近似值; 举个例子:从A到B,应该有73千米,但是我们近似成了70千米;从C到D,应该是1373千米,我们近似成了1370千米,如果使用绝对误差,结果都是3…

YOLOv8训练自己的数据集,通过LabelImg

记录下labelImg标注数据到YOLOv8训练的过程,其中容易遇到labelImg的坑 数据集处理 首先在mydata下创建4个文件夹 images文件夹下存放着所有的图片,包括训练集和测试集等。后续会根据代码进行划分。 json文件夹里存放的是labelImg标注的所有数据。需要注意的是&…

【王道数据结构】【chapter2线性表】【P43t15】

单链表有环&#xff0c;是指单链表的最后一个节点的指针指向了链表中的某个结点&#xff08;通常单链表的最后一个节点的指针域是空的&#xff09;。试编写算法判断单链表是否存在环。 #include <iostream>typedef struct node{int data;node* next; }node,*list;list I…

java web 职位推荐系系统Myeclipse开发mysql数据库协同过滤算法java编程计算机网页项目

一、源码特点 java Web职位推荐系统是一套完善的java web信息管理系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

AWTK 开源串口屏开发(8) - 系统设置

AWTK 开源串口屏开发 - 系统设置 系统设置只是一个普通应用程序&#xff0c;不过它会用 默认模型 中一些内置的属性和命令&#xff0c;所以这里专门来介绍一下。 1. 功能 在这个例子会用到 默认模型 中一些下列内置的属性和命令&#xff1a; 内置属性 属性类型说明rtc_yea…

基于深度学习的狗狗类别检测

探索狗狗识别技术 引言1. 数据集介绍1.1 语境1.2 内容1.3 致谢 2. 项目背景与意义3. 项目实现流程3.1 数据处理与准备3.2 环境准备与工具安装3.3 模型配置与训练3.4 模型评估与预测3.5 模型推理与部署 4. 总结 服务 引言 随着人工智能技术的不断发展&#xff0c;图像识别已成为…

详解矩阵的LDU分解

目录 一. 矩阵分解 二. 解方程 三. 例题说明 四. 矩阵的LDU分解 五. 矩阵三角分解的唯一性 一. 矩阵分解 其实我们可以把一个线性系统&#xff08;Linear System&#xff09;看成两个三角系统&#xff08;Triangular Systems&#xff09;&#xff0c;本文章将解释为什么可…

Ubuntu 22.04 apt 安装 ros1 ros Noetic Ninjemys

众所周知 ros2还有很多功能没有移植&#xff0c;而ros1官方不再支持 ubuntu 20.04 之后的版本。另一方面Ubuntu 22.04 更新了很多对新硬件的驱动&#xff0c;有更好的兼容性和体验&#xff0c;这就变的很纠结。 如果想在 22.04 使用最新版本的 ros noetic 只有自己编译一个办法…

2024不可不会的StableDiffusion(二)

1. 引言 这是我关于StableDiffusion学习系列的第二篇文章&#xff0c;如果第一篇你还没有阅读&#xff0c;强烈推荐大家翻看前篇内容。在本文中&#xff0c;我们将学习构成StableDiffusion的各个基础组件&#xff0c;并针对每个组件的功能进行阐述。 闲话少说&#xff0c;我们…

JavaEE 网络编程

JavaEE 网络编程 文章目录 JavaEE 网络编程引子1. 网络编程-相关概念1.1 基本概念1.2 发送端和接收端1.3 请求和响应1.4 客户端和服务端 2. Socket 套接字2.1 数据包套接字通信模型2.2 流套接字通信模型2.3 Socket编程注意事项 3. UDP数据报套接字编程3.1 DatagramSocket3.2 Da…

matplotlib多个子图共用一个colorbar

文章目录 colorbar共用colorbar布局colorbar colorbar matplotlib默认提供的功能是&#xff0c;在多个子图中分别生成colorbar&#xff0c;例如 import numpy as np import matplotlib.pyplot as pltfig plt.figure() for i in range(2):ax fig.add_subplot(2,1,i1)ax plt…

掌握HTTP协议:GET和POST请求之间的关键差异

掌握HTTP协议&#xff1a;GET和POST请求之间的关键差异 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是用于在Web浏览器和服务器之间传递信息的协议。在HTTP中&#xff0c;GET请求和POST请求是两种最基本的请求方法。HTTP的底层是TCP/IP&#xff0c;所以GET和POST…

数据库设计的一些原则

文章目录 数据库设计原则表之间的关系一对一关系&#xff08;了解&#xff09;一对多&#xff08;多对一&#xff09;多对多联合主键和复合主键 数据库设计准则-范式1、函数依赖2、完全函数依赖3、部分函数依赖4、传递函数依赖5、码 第一范式第二范式第三范式第三范式 数据库设…

Go 从标准输入读取数据

fmt.Scan系列 fmt.Scan函数定义如下&#xff1a; // Scan scans text read from standard input, storing successive space-separated values into successive arguments. // Newlines count as space. // It returns the number of items successfully scanned. // If tha…

JZ15 二进制中1的个数(牛客)(C语言)

个人博客主页&#xff1a;https://blog.csdn.net/2301_79293429?typeblog 专栏&#xff1a;https://blog.csdn.net/2301_79293429/category_12545690.html 该题我为笨办法,与题解不同,如有疑问和见解,欢迎大家在评论区提出 题目链接: 二进制中1的个数_牛客题霸_牛客网 (now…

XSS靶场练习(pikachu和dvwa)

Pikachu靶场xss练习 反射型xss(get) 输入123发现被直接插入到了html中&#xff0c;而且输入框有字符长度限制 在url中构造payload:<script>alert(123)</script> 反射型xss(post) 查看源码发现登录界面没有任何机会&#xff1b;登录后输入123发现和xss(get)写入位…

Linux 驱动开发基础知识—— LED 驱动程序框架(四)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

联合 Maxlinear 迈凌 与 Elitestek 易灵思 - WPI 世平推出基于 FPGA 芯片的好用高效电源解决方案

近期 WPI 世平公司联合 Maxlinear 迈凌电源产品搭配 Elitestek 易灵思 FPGA 共同合作推出基于 FPGA 芯片的好用高效电源解决方案。 Elitestek 易灵思 FPGA 核心产品有 2 大系列 : Trion 系列与钛金系列。Trion 系列主要特点是 : 1. 40nm 工艺 2. 超低功耗 ( 可低至竞争对手的 …