【Redis缓存:常见问题及解决方案】

news2025/1/2 3:08:11

目录

①缓存雪崩

常见的解决方案

加锁排队

随机化过期时间

设置⼆级缓存

②缓存穿透

常见的解决方案

布隆过滤器

缓存空结果

接口层增加校验

③缓存击穿

常见的解决方案

加锁排队

设置热点数据永远不过期

分布式缓存系统

④缓存预热

缓存预热的实现思路 


①缓存雪崩

缓存雪崩是指在短时间内,有大量缓存同时过期,导致⼤量的请求直接查询数据库,从⽽对数据库造成了巨⼤的压⼒,严重情况下可能会导致数据库宕机的情况叫做缓存雪崩。
我们先来看下正常情况下和缓存雪崩时程序的执⾏流程图,正常情况下系统的执⾏流程如下图所示:

缓存雪崩的执⾏流程,如下图所示:

以上对⽐图可以看出缓存雪崩对系统造成的影响,那如何解决缓存雪崩的问题?

常见的解决方案

加锁排队

加锁排队可以起到缓冲的作⽤,防⽌⼤量的请求同时操作数据库,但它的缺点是增加了系统的响应时间,降低了系统的吞吐量,牺牲了⼀部分⽤户体验。

随机化过期时间

为了避免缓存同时过期,可在设置缓存时添加随机时间,这样就可以极⼤的避免⼤量的缓存同时失效。示例代码如下:

// 缓存原本的失效时间
int exTime = 10 * 60;
// 随机数⽣成类
Random random = new Random();
// 缓存设置
jedis.setex(cacheKey, exTime+random.nextInt(1000) , value);

设置⼆级缓存

⼆级缓存指的是除了 Redis 本身的缓存,再设置⼀层缓存,当 Redis 失效之后,先去查询⼆级缓存。
例如可以设置⼀个本地缓存,在 Redis 缓存失效的时候先去查询本地缓存⽽⾮查询数据库。
加⼊⼆级缓存之后程序执⾏流程,如下图所示:

②缓存穿透

缓存穿透是指查询数据库和缓存都无数据,因为数据库查询⽆数据,出于容错考虑,不会将结果保存到缓存中,因此每次请求都会去查询数据库,这种情况就叫做缓存穿透。

缓存穿透执行流程如下图所示:

其中红⾊路径表示缓存穿透的执⾏路径,可以看出缓存穿透会给数据库造成很⼤的压⼒。

常见的解决方案

布隆过滤器

布隆过滤器是一种概率型数据结构,其特点是高效地插入和查询,可以用来告诉你“某样东西一定不存在或者可能存在”。

缓存空结果

对于数据库中不存在的数据,也对其在缓存中设置默认值Null,为避免占用资源,一般过期时间会比较短,将空结果的缓存时间设置的短⼀些,例如 3-5 分钟。这种方案相对简单,但是也容易破解,比如攻击者通过分析数据格式,不重复的请求数据库不存在数据,那这种方案就等于失效的。

接口层增加校验

如用户鉴权校验,id做基础校验,id<=0的直接拦截;从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒。

③缓存击穿

缓存击穿指的是某个热点(key)缓存在某⼀时刻恰好失效了,然后此时刚好有大量的并发请求,此时这些请求将会给数据库造成巨⼤的压⼒,这种情况就叫做缓存击穿。

缓存击穿的执⾏流程如下图所示:

区分缓存穿透:

缓存击穿发生在某个热点(key)缓存过期后,缓存穿透发生在缓存和数据库中都没有数据时

常见的解决方案

加锁排队

此处理⽅式和缓存雪崩加锁排队的⽅法类似,都是在查询数据库时加锁排队,缓冲操作请求以此来减少服务器的运⾏压⼒。

设置热点数据永远不过期

对于某些热点缓存,我们可以设置永不过期,这样就能保证缓存的稳定性,但需要注意在数据更改之后,要及时更新此热点缓存,不然就会造成查询结果的误差。

分布式缓存系统

当热点数据过期后,其他线程来获取数据的时候,如果缓存中没有这个数据,那么我们就通知所有的节点来查询数据库,并把查询结果设置到缓存中。这样,即使热点数据过期了,由于缓存系统中存在这个数据,所以也不会发生缓存击穿。 

④缓存预热

⾸先来说,缓存预热并不是⼀个问题,⽽是使⽤缓存时的⼀个优化⽅案,它可以提⾼前台⽤户的使⽤体验。
缓存预热指的是在系统启动的时候,先把查询结果预存到缓存中,以便⽤户后⾯查询时可以直接从缓存中读取,以节约⽤户的等待时间
缓存预热的执⾏流程,如下图所示:

缓存预热的实现思路

  1. 把需要缓存的⽅法写在系统初始化的方法中,这样系统在启动的时候就会⾃动的加载数据并缓存数据
  2. 把需要缓存的⽅法挂载到某个页面或后端接口上手动触发缓存预热
  3. 设置定时任务,定时⾃动进⾏缓存预热。


 




 



 



 




 


 

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

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

相关文章

C语言开发手册,辅助工具

方便查函数,头文件,日常语法,c99与c11的差异,等 https://www.php.cn/manual/view/34866.html

微信小程序通过普通二维码扫码进入指定页面带参数

微信小程序通过普通二维码扫码进入指定页面带参数 首先进入公众号开发者后台 https://mp.weixin.qq.com/ 进入开发管理->开发设置 扫普通链接二维码打开小程序 二维码规则填写服务器域名、填写前缀占用规则不占用就是其他开发者都可以使用这个后缀&#xff0c;占用则只能…

MYSQL性能优化——基于成本的优化

MYSQL性能优化 详见 GitBook MYSQL性能优化 什么是成本 我们之前老说MySQL执行一个查询可以有不同的执行方案&#xff0c;它会选择其中成本最低&#xff0c;或者说代价最低的那种方案去真正的执行查询。不过我们之前对成本的描述是非常模糊的&#xff0c;其实在MySQL中一条查…

【计算思维题】少儿编程 蓝桥杯青少组计算思维 数学逻辑思维真题详细解析第10套

少儿编程 蓝桥杯青少组计算思维题真题及解析第10套 1、明明买了一个扫地机器人,可以通过以下指令控制机器人运动: F:向前走 10 个单位长度 L:原地左转 90 度 R:原地右转 90 度 机器人初始方向向右,需要按顺序执行以下那条指令,才能打扫完下图中的道路 A、F-L-F-R-F-F-R-F-…

北邮22级信通院数电:Verilog-FPGA(3)实验“跑通第一个例程”modelsim仿真及遇到的问题汇总(持续更新中)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 注意&#xff1a;本篇文章所有绝对路径的展示都来自…

apache poi 实现Excel 下拉联动

原文链接&#xff1a;Java poi实现Excel 下拉联动 Java 实现Excel 下拉联动&#xff0c;本示例中实现了省市区乡镇村联动。适用于03版本Excel。 依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi…

vue 01 创建一个简单vue页面

去vue官网下载vue.js 引用vue.js vue语法 一个vue实例&#xff0c;绑定一个容器&#xff0c;一对一关系 <!DOCTYPE html> <html><head><meta charset"UTF-8"/><title>初始Vue</title><script type"text/javascript&qu…

通过Sealos 180秒部署一套K8S集群

通过Sealos 180秒部署一套K8S集群 一、主机准备 1.1 主机操作系统说明 序号操作系统及版本备注1CentOS7u9 1.2 主机硬件配置说明 k8s集群CPU及内存最低分别为2颗CPU、2G内存&#xff0c;硬盘建议为100G 需求CPU内存硬盘角色主机名值8C8G1024GBmasterk8s-master01值8C8G1024…

面试时总被问,你认为项目管理最难的什么?

导言&#xff1a; 项目管理是一项复杂而又富有挑战性的工作&#xff0c;涉及到资源管理、风险管理、沟通和协调、时间管理以及变更管理等众多方面。然而&#xff0c;在这些方面中&#xff0c;很多人认为其中最具挑战的是时间管理。本文将从不同角度探讨时间管理在项目管理中的重…

default 和 delete 与默认构造函数 的使用

前言 使用default和delete关键字来干预编译器自动生成的函数。让我详细解释一下这些知识点&#xff1a; 正文 编译器生成的默认构造函数&#xff1a; 如果类A没有定义任何构造函数&#xff0c;那么编译器会自动生成一个无参的默认构造函数 A()。这个默认构造函数实际上是一个…

计算机视觉与深度学习-卷积神经网络-卷积图像去噪边缘提取-卷积与边缘提取-[北邮鲁鹏]

目录标题 参考学习链接什么是图像边缘&#xff1f;为什么研究边缘&#xff1f;有哪些边缘种类&#xff1f;表面法向不连续深度不连续表面颜色不连续光照不连续 如何检测边缘&#xff1f;图像求导图像梯度图像梯度的方向图像梯度的模 噪声的影响噪声影响带来的问题解决办法&…

系统架构设计师-数据库系统(2)

目录 一、规范化理论 1、规范化理论的基本概念 2、Armstrong公理 3、候选键 4、范式 5、模式分解 一、规范化理论 1、规范化理论的基本概念 非规范化的关系模式&#xff0c;可能存在的问题包括&#xff1a;数据冗余、更新异常、插入异常、删除异常。 下表可拆分为 学号、姓名…

链表应用(C++,递增合并、递增求交集、逆序、删除区间)

#include<iostream> using namespace std; typedef struct list {int data;list* next; }list,*linklist; void Newlist(linklist& l) {l new list;l->next NULL; } void Createlist(linklist& l) {cout << "输入链表长度&#xff1a;" <…

OpenCV之摩尔纹

摩尔纹 用数码相机拍摄景物中&#xff0c;如果有密纹的纹理&#xff0c;常常会出现莫名其妙的水波样条纹。这就是摩尔纹。简单的说&#xff0c;摩尔纹是差拍原理的一种表现。从数学上讲&#xff0c;两个频率接近的等幅正弦波叠加&#xff0c;合成信号的幅度将按照两个频率之差变…

捕获多种异常练习

捕获多种异常 下面存在三种异常&#xff1a;ValueError、KeyboardInterrupt 和其他异常&#xff0c;分别捕获并输出相应的提示语句 当用户输入123以外的字符时出现ValueError异常&#xff0c;这时提示用户输入数字1-3&#xff1b;当用户在输入数字后CtrlC时出现KeyboardInterru…

利用Pycharm将python程序打包为exe文件(亲测可用)

最近做了一个关于py的小项目&#xff0c;对利用Pycharm将python文件打包为exe文件不是很熟悉&#xff0c;故学习记录之。 目录 一、下载pyinstaller库 二、打开Pycharm进行打包&#xff08;不更改图标&#xff09; 三、打开Pycharm进行打包&#xff08;更改图标&#xff09…

ArcGIS Engine:C#基础语法的了解

目录 01 前言 02 实验 2.1 创建“Hello World”程序 2.2 创建程序&#xff0c;完成成绩评定功能 2.3 创建程序&#xff0c;完成1到100的累加 2.4 窗体应用程序 01 前言 学了一些语言了&#xff0c;确实发现&#xff0c;语言只是工具&#xff0c;只有你作为初恋的语言值得…

Linux系统编程6(线程互斥,锁,同步,生产消费模型)

上篇文章介绍完线程的概念后&#xff0c;我们将在这篇文章中初步探讨线程编程以及线程应用中的问题&#xff0c;这篇文章将以抢票系统为例&#xff0c;贯穿整篇文章。笔者将介绍在多线程编程中会出现的问题&#xff0c;什么是同步&#xff1f;什么是互斥&#xff1f;为什么多线…

【nginx】(13: Permission denied) while connecting to upstream

一、问题背景 在使用nginx基于域名转发时&#xff0c;发现通过curl可以请求成功&#xff0c;但是通过外网域名访问无法访问通&#xff0c;通过日志查询发现如下问题 2023/09/18 11:26:18 [crit] 11981#11981: *106 connect() to 127.0.0.1:12500 failed (13: Permission deni…

如何理解JavaScript定时器的4种写法-附带面试题讲解

在JavaScript里&#xff0c;我们已经会使用一些原生提供的方法来实现需要延时执行的操作代码&#xff0c;比如很多在线时钟的制作&#xff0c;图片轮播的实现&#xff0c;还有一些广告弹窗&#xff0c;但凡可以自动执行的东西&#xff0c;都是可以和定时器有关的。今天就来和大…