当前位置: 首页 > news >正文

MySQL八股-全局锁,表级锁,表锁,元数据锁,意向锁,行级锁,行锁,间隙锁,临键

文章目录

  • 全局锁
  • 表级锁
    • 表锁(表级锁)
    • 元数据锁(MDL,Meta Data Lock,表级锁)
      • 元数据锁演示
        • 元数据锁兼容的情况
        • 元数据锁互相阻塞的情况
    • 意向锁(Intention lock,表级锁)
      • 意向锁分类
      • 意向锁演示:
        • 意向共享锁(**IS**)与表读锁是兼容的
        • 意向排他锁(**IX**)与表读锁、写锁都是互斥的
  • 行级锁
    • 行锁(Record-Lock)
      • 行锁的加锁情况
      • 行锁优化
    • 间隙锁(Gap-Lock)
      • A.索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁 。
        • 数据准备:
      • B. 索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-keylock 退化为间隙锁。
        • 数据准备
      • C. 索引上的范围查询(唯一索引)--会访问到不满足条件的第一个值为止。

全局锁

全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL
句,已经更新操作的事务提交语句都将被阻塞

DML是Update,insert,delete语句,数据操纵语言
DDL是Alter,create,drop之类的语句,数据定义语言
DQL,是查询,数据查询语言

数据库中加全局锁,是一个比较重的操作,存在以下问题:

  • 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
  • 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导
    致主从延迟。

表级锁

表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。
对于表级锁,主要分为以下三类:

  1. 表锁
  2. 元数据锁(meta data lock,MDL)
  3. 意向锁

表锁(表级锁)

表锁作用是把整张表锁住
对于表锁,分为两类:

  • 表共享读锁(read lock)
  • 表独占写锁(write lock)

读锁

在这里插入图片描述

在这里插入图片描述

写锁

在这里插入图片描述

在这里插入图片描述

结论: 读锁不会阻塞其他客户端的读,但是会阻塞写。写锁既会阻塞其他客户端的读,又会阻塞其他客户端的写。

元数据锁(MDL,Meta Data Lock,表级锁)

元数据说的是表结构,元数据锁是锁住了表结构的意思

MDL作用是防止DML和DDL语句冲突问题的

meta data lock , 元数据锁,简写MDL。
MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与DDL冲突,保证读写的正确性。这里的元数据,大家可以简单理解为就是一张表的表结构。 也就是说,某一张表涉及到未提交的事务时,是不能够修改这张表的表结构的。在MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)。

在这里插入图片描述
注意:这里Shared-Read和Shared-Write是兼容的!!只是Shared-Read/Shared-Write与Exclusive互斥!

元数据锁演示

元数据锁兼容的情况

当执行SELECT、INSERT、UPDATE、DELETE等语句时,添加的是元数据共享锁(SHARED_READ / SHARED_WRITE),之间是兼容的。
在这里插入图片描述
上图如何理解?左边的客户端开启事务,进行查询操作,开启Shared-Read锁,右边客户端进行查询和更新操作,开启了Shared-Read和Shared-Write锁,但是由于表级锁里面元数据读写锁是兼容的,因此不阻塞另外一个客户端的操作,是兼容的!!

元数据锁互相阻塞的情况

当执行SELECT语句时,添加的是元数据共享锁(SHARED_READ),会阻塞元数据排他锁(EXCLUSIVE),之间是互斥的。
左边客户端开启Shared-read元数据读锁,右边用到了Alter语句,Exclusive级别的排他锁,因此是互斥,会导致阻塞!!

在这里插入图片描述
下面这个语句可以查询看元数据锁的加锁情况。

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks ;

刚开始只有performance-schema里面有元数据读锁
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

意向锁(Intention lock,表级锁)

规避行锁与表锁加锁时的冲突问题

为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

意向锁应用场景是这样的:
假如我对表A的某一行执行更新,则需要对表A的这行加上行锁,然后假如我有一个线程来了,需要加表锁,那么我们还需要挨行的去检查每一行是否存在行锁,这十分憨批,如果我们设置一个类似于标志位flag,flag=0,无行锁,flag=1,有行锁,这就解决了!这个flag就是本章节提出的意向锁。每次来检查是否有意向锁,是否和表锁冲突就完事儿了!!

在这里插入图片描述
当客户端二,想对这张表加表锁时,会检查当前表是否有对应的行锁,如果没有,则添加表锁,此时就会从第一行数据,检查到最后一行数据,效率较低。
在这里插入图片描述
有了意向锁之后 :
客户端一,在执行DML操作时,会对涉及的行加行锁,同时也会对该表加上意向锁。
在这里插入图片描述
在这里插入图片描述

意向锁分类

  • 意向共享锁(IS): 由语句select … lock in share mode添加 。 与 表锁共享锁(read)兼容,与表锁排他锁(write)互斥。IS = Intention Select
  • 意向排他锁(IX): 由insert、update、delete、select…for update添加 。与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥。IX=Intention + X (X为Insert,Update,delete,…任意一个)

所以一旦Select 。。。locks in Shared mode,会存在IS和MDL的Shared-Read(元数据锁)

一旦事务提交了,意向共享锁、意向排他锁,都会自动释放

可以通过以下SQL,查看意向锁及行锁的加锁情况:

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from
performance_schema. data_locks;

意向锁演示:

意向共享锁(IS)与表读锁是兼容的

表锁与IS有可能冲突,表锁的LOCK READ与IS兼容,表锁的写锁与IX不兼容,互斥
在这里插入图片描述

意向排他锁(IX)与表读锁、写锁都是互斥的

IX与表锁的lock read,lock write都互斥!!
在这里插入图片描述

行级锁

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中
InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:

  1. 行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持
    在这里插入图片描述
  2. 间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持
    在这里插入图片描述
  3. 临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持
    在这里插入图片描述

行锁(Record-Lock)

行级锁有行锁,间隙锁,临键锁三种类型。现在介绍其中的行锁
InnoDB实现了以下两种类型的行锁:

  • 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。(注意S是行锁里面的共享锁,IS是意向锁里面的共享锁,S是行,IS是表,都是读的级别)
  • 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。(IX是意向锁,表锁,X是行的排他锁,行级)
    在这里插入图片描述

行锁的加锁情况

常见的SQL语句,在执行时,所加的行锁如下:
在这里插入图片描述
FOR UPDATE是在SQL语句中显式使用排他锁,避免其他事务干扰
LOCK IN SHARE MODE是显式使用共享锁

行锁优化

默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key锁进行搜索和索引扫描,以防止幻读。

  • 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。 next-key锁(间隙锁+行锁) → \to 行锁

遍历的时候用索引扫描,又因为默认是使用next-key锁,因为你本身就是唯一的,还是等值查询,针对存在的记录查询,因此直接行锁就完事儿了

  • InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时 就会升级为表锁。
    next-key锁(间隙锁+行锁) → \to 表锁

(比如通过非索引字段查询并且查询的时候带上了锁,比如是行锁里面的排他锁or行锁里面的共享锁,除非你只Select,不加任何的锁)

可以通过以下SQL,查看意向锁及行锁的加锁情况:

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

PS:
注意一下有区别:

下面这个语句可以查询看元数据锁的加锁情况。

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks ;

可以通过以下SQL,查看意向锁及行锁的加锁情况:

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks ;

一个是metadata_locks一个是data_locks,情况不一样!! ,而且Select出来的列名也是不一样!!

间隙锁(Gap-Lock)

间隙锁的作用防止多个事务并发时发生的幻读现象。

幻读
两次查询结果(两次读取结果)不一样就是幻读,为此,在可重复读,RR级别下,特此加入间隙锁,试图消除幻读现象,保证读1次和读2次,读99次结果都是一样的!!

默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key 锁进行搜索和索引扫描,以防止幻读。

  • 索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁 。

如果这里是索引上的等值查询(唯一索引),给存在的记录加锁时, 优化为行锁 。又是前面讨论过的情况

  • 索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁。
  • 索引上的范围查询(唯一索引)–会访问到不满足条件的第一个值为止。

更详细的间隙锁参考另外一篇文章:
https://blog.csdn.net/weixin_46028606/article/details/144471986?fromshare=blogdetail&sharetype=blogdetail&sharerId=144471986&sharerefer=PC&sharesource=weixin_46028606&sharefrom=from_link

A.索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁 。

数据准备:

DROP TABLE IF EXISTS `stu`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `stu` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`age` int NOT NULL,PRIMARY KEY (`id`),KEY `idx_stu_age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;--
-- Dumping data for table `stu`
--LOCK TABLES `stu` WRITE;
/*!40000 ALTER TABLE `stu` DISABLE KEYS */;
INSERT INTO `stu` VALUES (1,'tom',10),(3,'cat',30),(9,'rose',90),(11,'jetty',110),(19,'lily',190),(25,'luci',250);
/*!40000 ALTER TABLE `stu` ENABLE KEYS */;
UNLOCK TABLES;

X,GAP表示行锁+间隙锁,这俩加起来就是临键锁next-key锁。

在这里插入图片描述

B. 索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-keylock 退化为间隙锁。

数据准备
DROP TABLE IF EXISTS `hm1`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `hm1` (`id` int NOT NULL AUTO_INCREMENT,`num` int NOT NULL,PRIMARY KEY (`id`),KEY `num` (`num`)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;--
-- Dumping data for table `hm1`
--LOCK TABLES `hm1` WRITE;
/*!40000 ALTER TABLE `hm1` DISABLE KEYS */;
INSERT INTO `hm1` VALUES (1,6),(2,12),(3,16),(40,18),(50,29);
/*!40000 ALTER TABLE `hm1` ENABLE KEYS */;
UNLOCK TABLES;

在这里插入图片描述
验证:
在这里插入图片描述
下图试图插入num=28的记录,被阻塞住了,还超时了
在这里插入图片描述

C. 索引上的范围查询(唯一索引)–会访问到不满足条件的第一个值为止。

图片水印挡住了+笔误了,字是锁住最后一个记录50和后面的(50,+∞)
在这里插入图片描述

学习资料:
通过网盘分享的文件:MySQL-进阶篇.pdf
链接: https://pan.baidu.com/s/1Wqryjq3JtB5FfP5_EULojw?pwd=e3mf 提取码: e3mf
–来自百度网盘超级会员v8的分享

相关文章:

MySQL八股-全局锁,表级锁,表锁,元数据锁,意向锁,行级锁,行锁,间隙锁,临键

文章目录 全局锁表级锁表锁(表级锁)元数据锁(MDL,Meta Data Lock,表级锁)元数据锁演示元数据锁兼容的情况元数据锁互相阻塞的情况 意向锁(Intention lock,表级锁)意向锁分类意向锁演示:意向共享锁(**IS**)与…...

(四)Spring Cloud Alibaba 2023.x:高效构建 Gateway 网关服务

目录 前言 准备 项目集成 pom.xml引入依赖 启动类 yml文件添加网关配置 修改消费者FeignService类 结果验证 前言 Spring cloud alibaba 体系中构建微服务,我们使用Spring Cloud Gateway 作为服务网关, Gateway是Spring 官方推出的一款基于 Web…...

Android XR 是什么?解释它的功能、设备、开发工具等

什么是“Android XR”? Android XR是最新配备AI的OS(操作系统),兼容耳机和眼镜(AR眼镜)。 沉浸式剧场 从视频列表中选择... 您可以体验完全身临其境的视频观看体验。 无限工作空间 您的现实世界将成为您…...

【算法】实体关系抽取

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...

Codeforces Round 993 (Div. 4)题解

A. Easy Problem 思路&#xff1a;经过看了一眼&#xff0c;我们发现&#xff0c;ab的和一定是n&#xff0c;且两个都是正整数&#xff0c; 所以a的范围就是从1~n-1 所以输出n-1即可 #include<bits/stdc.h> using namespace std; #define int long long int t; int n…...

【计算机网络】期末考试预习复习|中

作业讲解 转发器、网桥、路由器和网关(4-6) 作为中间设备&#xff0c;转发器、网桥、路由器和网关有何区别&#xff1f; (1) 物理层使用的中间设备叫做转发器(repeater)。 (2) 数据链路层使用的中间设备叫做网桥或桥接器(bridge)。 (3) 网络层使用的中间设备叫做路…...

从零用java实现 小红书 springboot vue uniapp (4)个人主页优化

前言 移动端演示 http://8.146.211.120:8081/#/ 前面的文章我们基本完成了详情页开发 今天我们具体的去进行实现个人中心 并且分享我开发时遇到的问题 首先先看效果 我们对布局整体规划一下 个人名片 半透明背景 刚开始我用的是 <view style"background-image: ur…...

为“行车大脑”降温:Simdroid-EC助力汽车ECU设计研发

ECU&#xff08;Electronic Control Unit&#xff0c;电子控制单元&#xff09;被誉为汽车的行车大脑&#xff0c;在工作时会产生大量的热量&#xff0c;而其散热存在以下难题&#xff1a;一是工作环境恶劣&#xff0c;ECU常处于高温环境中&#xff1b;二是ECU所处的空间较为狭…...

视频汇聚平台:Liveweb视频流媒体平台视频监控系统解决方案

数字化技术在安防领域的广泛应用已经成为公安等重要执法部门的重要趋势&#xff0c;主要得益于无线网络通信技术和计算机技术的快速进步。传统的视频监控系统存在诸多局限&#xff0c;例如只能进行现场监视&#xff0c;报警信息传输简单&#xff0c;无法远距离传输视频信号&…...

通过解调使用正则化相位跟踪技术进行相位解包裹

1. 绪论 光学计量学通常使用光学干涉仪来测量各种物理量。1,2 根据应用的不同&#xff0c;可以使用多种类型的干涉仪&#xff0c;但它们的共同目标是产生一个由被测物理量调制的条纹图案。使用这种光束编码程序可以检测到的物理量范围非常广&#xff1a;深度测量、应变分析、温…...

VMware替代 | 双一流大学采用ZStack ZSphere虚拟化平台加速医学应用算法分析

某双一流大学医学部在面对日益增长的医学应用算法分析需求时&#xff0c;选择采用ZStack ZSphere虚拟化平台&#xff0c;以满足其高性能计算和GPU业务应用的迫切需求。该平台凭借其轻量化、卓越性能及易用性&#xff0c;成功解决了医学部在虚拟化及GPU应用场景中的挑战。随着平…...

UNIAPP框架uView初步集成与开发设计

uView UI&#xff0c;是uni-app生态最优秀的UI框架&#xff0c;全面的组件和便捷的工具会让您信手拈来&#xff0c;如鱼得水。本文章分享UNIAPP集成使用uView页面动态开发设计。 一、使用HBuilder X 直接导入插件&#xff0c;下载后重启 uView - DCloud 插件市场 二、配置样…...

C05S08-LVS负载均衡

一、LVS 1. LVS概述 LVS&#xff08;Linux Virtual Server、Linux虚拟服务&#xff09;是一种基于Linux系统集群的负载均衡方案&#xff0c;属于四层的负载均衡。 集群&#xff1a;将相同组件部署在不同的服务器上&#xff0c;提供统一的服务&#xff0c;以及同样的功能&…...

C 语言代码诗韵:数字功能的雅集华章

函数基本操作练习 主要内容&#xff1a; 本任务主要练习函数的申请、定义、调用等&#xff0c;主要包含以下功能&#xff1a; 1&#xff09;编写函数&#xff0c;输入一个整数&#xff0c;求各个数字之和&#xff1b; 2&#xff09;编写函数&#xff0c;计算1&#xff01;2&…...

ps案例制作

宣传海报 暖色调海报商品展示图...

【C++】列表初始化、声明、范围for、array容器

列表初始化、声明、范围for、array容器 一、统一的列表初始化1.1 使用{ }初始化1.2 initializer_list容器 二、声明2.1 auto关键字2.2 decltype关键字2.3 nullptr关键字 三、范围for四、array容器和forward_list容器 一、统一的列表初始化 1.1 使用{ }初始化 在C98中&#xf…...

C++智能指针详解

一、智能指针简介 智能指针是一个类似于指针的类&#xff0c;将指针交给这个类对象进行管理&#xff0c;我们就可以像使用指针一样使用这个类&#xff0c;并且它会自动释放资源。 智能指针运用了 RAII 的思想(资源获得即初始化)。RAII 是指&#xff0c;用对象的生命周期来管理资…...

基础库正则表达式

我们已经可以用requests 库来获取网页的源代码&#xff0c;得到 HTML 代码。但我们真正想要的数据是包含在 HTML代码之中的&#xff0c;要怎样才能从 HTML,代码中获取想要的信息呢?正则表达式就是其中一个有效的方法。 本篇博客我们将了解一下正则表达式的相关用法。正则表达…...

【spring专题】spring如何解析配置类和扫描包路径

文章目录 目标重要的组件加载配置类启动解析组件定位配置类解析配置类 扫描过程总结 目标 这是我们使用注解方式启动spring容器的核心代码 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(MyConfig.class); User user (Us…...

MyBatis框架的入门

目录 MyBatis第一章&#xff1a;框架的概述1. MyBatis框架的概述 第二章&#xff1a;MyBatis的入门程序1. 创建数据库和表结构2. MyBatis的入门步骤 MyBatis 第一章&#xff1a;框架的概述 1. MyBatis框架的概述 MyBatis是一个优秀的基于Java的持久层框架&#xff0c;内部对…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...