MySQL数据库笔记——多版本并发控制MVCC
大家好,这里是Good Note,关注 公主号:Goodnote,本文详细介绍MySQL的并发控制:多版本并发控制MVCC。
文章目录
- 背景介绍
- 数据库并发控制——锁机制
- 悲观锁和乐观锁
- 悲观锁
- 乐观锁
- 数据库并发控制——MVCC 的引入
- MVCC 和锁机制的对比
- MySQL 的多版本并发控制 (MVCC)
- 快照读和当前读
- 快照读和当前读的对比
- 隐藏的系统列
- Undo Log(回滚日志)
- Read View(读视图)
- 可见性算法(Visibility Algorithm)
- MVCC 支持的事务隔离级别
- 整体工作流程
- 总结
- MVCC 的优点
- MVCC 的局限性
- 示例:MVCC 的快照读
- 历史文章
背景介绍
许多人认为 MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种乐观锁的实现方式,我们先来了解一下什么是乐观锁和悲观锁。
数据库并发控制——锁机制
在数据库系统中,并发控制是保证多个事务在并发执行时数据一致性的核心技术。传统的并发控制方法是使用 锁,它是一种直接而有效的解决方案。
- 锁的分类:
- DQL(Data Query Language,数据查询语言):查询数据(如
SELECT
)时使用 读锁。 - DML(Data Manipulation Language,数据操作语言):对数据进行增、删、改操作(如
INSERT
、DELETE
、UPDATE
)时使用 写锁。 - DDL(Data Definition Language,数据库定义语言):定义和修改表结构(如
CREATE TABLE
、DROP TABLE
)时,通常会使用 元数据锁。
- DQL(Data Query Language,数据查询语言):查询数据(如
悲观锁和乐观锁
悲观锁
- 概念:
悲观锁假定会发生并发冲突,因此在对资源进行操作之前,会先加锁,确保其他事务无法同时访问该资源。 - 特点:
- 需要加锁,锁定资源后,其他线程对该资源的操作会被阻塞。
- 开销较大,可能导致性能下降。
- 应用场景:
- 适用于并发冲突频繁的场景。
- 例子:
数据库中的 行级锁 或 Java 中的synchronized
关键字。
乐观锁
- 概念:
乐观锁假定不会发生并发冲突,因此不加锁,而是在更新数据时,通过比较版本号或条件检查来保证操作的正确性。 - 特点:
- 不加锁,操作更轻量级。
- 需要在操作完成后检查是否发生冲突。
- 应用场景:
- 适用于并发冲突较少的场景。
- 实现方式:
- 版本号机制:每次修改数据时,更新版本号。更新操作成功的前提是版本号没有变化。
- CAS(Compare And Swap):通过原子性比较和更新操作实现乐观锁。
数据库并发控制——MVCC 的引入
许多人认为 MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种乐观锁的实现方式,但 MVCC 的核心在于通过 版本控制和可见性算法 来实现数据库的并发控制。InnoDB 的 MVCC 通过隐藏字段、Undo Log 和 Read View 协同工作,实现了高效的多版本并发控制:
-
隐藏字段:
- 提供版本控制信息,判断事务的可见性。
-
Undo Log:
- 保存数据的历史版本,支持事务回滚和快照读。
-
Read View:
- 在事务启动时生成的元数据,用于确定哪些数据版本对事务可见。
MVCC 和锁机制的对比
特性 | 锁(悲观锁/乐观锁) | MVCC |
---|---|---|
加锁开销 | 悲观锁需要加锁,开销较大;乐观锁无需加锁 | 不加锁,依赖多版本数据 |
并发性能 | 读写互斥,可能导致线程阻塞 | 读写分离,读操作不阻塞写 |
实现方式 | 直接加锁或通过版本号/CAS 判断 | 通过 Undo Log 和事务视图维护多版本 |
适用场景 | 并发冲突频繁的场景(悲观锁) | 读多写少的场景,且冲突较少 |
优缺点 | 加锁开销大,读写冲突会阻塞 | 空间开销较大,但读性能更优 |
MySQL 的多版本并发控制 (MVCC)
多版本并发控制 (MVCC, Multi-Version Concurrency Control) 是 MySQL 用于实现事务隔离的一种机制,主要应用于 InnoDB 存储引擎。通过 MVCC,MySQL 可以在高并发环境下实现 读写并行,同时减少锁的使用,提高性能。
快照读和当前读
-
快照读(Snapshot Read):
- 读取的是数据的快照版本(历史版本),即事务开始时的数据状态,而不是最新的。
- 常见的
SELECT
语句都是快照读,除非显式使用加锁查询。
-
当前读(Current Read):
- 读取的是最新版本的数据,并且会对读取的数据加锁以确保一致性。
- 常见的当前读操作包括:
SELECT ... FOR UPDATE
SELECT ... LOCK IN SHARE MODE
UPDATE
DELETE
INSERT
快照读和当前读的对比
操作类型 | 快照读(Snapshot Read) | 当前读(Current Read) |
---|---|---|
使用场景 | 普通 SELECT 查询 | 加锁查询(SELECT ... FOR UPDATE 等) |
是否加锁 | 不加锁 | 加锁 |
数据版本 | 读取快照版本,使用 Undo Log | 读取当前版本,可能会阻塞 |
是否支持 MVCC | 支持 | 支持,但需要额外的锁操作 |
隐藏的系统列
InnoDB 存储引擎会为每一行记录添加了以下 三个隐藏的系统列,用于实现 MVCC:
isDelete | DB_TRX_ID | DB_ROLL_PTR | RowID(可选) | id | name | password |
---|---|---|---|---|---|---|
是否删除 | 事务 ID | 回滚指针 | 隐藏的自增 ID。如果表未指定主键,系统会自建 | id | name | password |
字段名 | 含义 |
---|---|
isDelete | 标记该记录是否被逻辑删除,删除标志不是单独的字段,而是存储在记录头信息中,用户不可见。 |
DB_TRX_ID | 记录每行数据最近一次修改(插入/更新)所对应的事务 ID(Read View中的事务ID)。 |
DB_ROLL_PTR | 回滚指针,指向该记录的 undo log 日志,保存行的历史版本。 |
Undo Log(回滚日志)
Undo Log 是 InnoDB 存储引擎用于实现事务回滚、快照读(MVCC)的重要机制之一。它记录数据修改前的旧版本,并通过回滚指针(DB_ROLL_PTR
)形成一条 Undo 日志链。
-
功能:
- 事务回滚:
- 当事务未提交或被回滚时,Undo Log 提供修改前的数据,用于恢复到原始状态,撤销未提交事务对数据库的影响。
- 多版本控制(MVCC):
- Undo Log 保存了数据的历史版本,通过回滚指针(
DB_ROLL_PTR
),其他事务可以通过 Undo Log 获取旧版本数据。
- Undo Log 保存了数据的历史版本,通过回滚指针(
- 事务回滚:
-
Undo Log 的特性:
- 逻辑日志:
- 记录逻辑上的操作。例如:
- 删除一条记录时,Undo Log 会记录一个对应的“插入操作”。
- 更新一条记录时,Undo Log 会记录一个对应的“反向更新操作”。
- 记录逻辑上的操作。例如:
- 存储位置:
- Undo Log 存储在 回滚段 中。
- 逻辑日志:
-
Undo Log 的分类:
- Insert Undo Log:
- 记录事务插入数据时的日志。
- 特点:事务提交后即可丢弃,因为没有其他事务需要访问它。
- Update Undo Log:
- 记录事务更新或删除数据时的日志。
- 特点:事务提交后,仍需保留以支持快照读,只有当没有比该日志更早的
Read View
存在时,才能删除。
- Insert Undo Log:
-
问题与优化:
- 长事务可能导致 Undo Log 无法及时清理,因为较早的
Read View
仍然需要访问旧版本数据。这会导致存储空间占用过大,建议避免长时间未提交的事务。
- 长事务可能导致 Undo Log 无法及时清理,因为较早的
Read View(读视图)
Read View 是事务在执行快照读(Snapshot Read)时生成的一种快照机制,用于判断当前事务对哪些数据版本可见。
-
功能:
- Read View 确保事务在快照读时能够看到一致性的数据。
- 通过可见性算法(Visibility Algorithm)判断某个数据版本是否对当前事务可见。
-
Read View 的组成:
alive_trx_list
:- 当前系统中活跃的事务 ID 列表,包含所有未提交事务的 ID。
up_limit_id
:alive_trx_list
中的最小事务 ID。
low_limit_id
:- 系统当前分配的最大事务 ID 加 1。
可见性算法(Visibility Algorithm)
在生成 Read View 后,InnoDB 通过以下步骤判断数据版本(DB_TRX_ID
)是否对当前事务可见, MVCC 的可重复读(Repeatable Read)隔离级别判断如下:
-
判断是否早于活跃事务的最小 ID:
- 如果
DB_TRX_ID < up_limit_id
,表明该版本在生成 Read View 前已提交,对当前事务可见。
- 如果
-
判断是否晚于最新事务的最大 ID:
- 如果
DB_TRX_ID >= low_limit_id
,表明该版本在生成 Read View 后才生成,对当前事务不可见。
- 如果
-
判断是否属于活跃事务:
- 如果
DB_TRX_ID
在alive_trx_list
中,说明生成 Read View 时该事务仍未提交,因此该版本对当前事务不可见。
- 如果
-
通过回滚指针查找可见版本:
- 如果数据版本不可见且
ROLL_PTR
不为空,则通过ROLL_PTR
指向的 Undo Log 查找更早的版本,重复上述判断,直到找到可见的版本。
- 如果数据版本不可见且
MVCC 支持的事务隔离级别
1. 读未提交(Read Uncommitted)
-
Read View:
- 不使用 Read View。
- 读取数据时直接读取最新版本,无论数据是否由其他事务提交。
-
可见性规则:
- 所有事务的最新修改版本对当前事务可见。
- 即使其他事务未提交的数据,也可以被读取(会发生脏读)。
-
特点:
- 无需 Undo Log,也不使用
alive_trx_list
等 Read View 属性。
- 无需 Undo Log,也不使用
2. 读已提交(Read Committed)
-
Read View:
- 每次查询都会生成新的 Read View,因此每次查询的结果可能不同。
- Read View 只在当前查询的上下文中生效,不跨查询复用。
-
可见性规则:
- 如果
DB_TRX_ID
小于up_limit_id
(即数据版本在当前查询的 Read View 生成之前已提交),则该版本对当前事务可见。 - 如果
DB_TRX_ID
在活跃事务列表中,说明该版本由未提交事务生成,对当前事务不可见。
- 如果
-
特点:
- 数据版本的可见性随着每次查询变化。
- 防止脏读,但可能发生不可重复读。
3. 可重复读(Repeatable Read)
-
Read View:
- 事务开始时生成一次 Read View,整个事务期间使用同一个快照,确保读取结果一致。
- 该 Read View 的属性(
up_limit_id
、low_limit_id
和alive_trx_list
)在事务期间不会变化。
-
可见性规则:
- 如果
DB_TRX_ID < up_limit_id
,说明数据版本在事务开始前已提交,对当前事务可见。 - 如果
DB_TRX_ID >= low_limit_id
,说明数据版本在事务开始后生成,对当前事务不可见。 - 如果
DB_TRX_ID
在alive_trx_list
中,说明数据版本由未提交的事务生成,对当前事务不可见。
- 如果
-
特点:
- 读操作始终基于事务开始时生成的 Read View。
- 防止脏读和不可重复读,但可能发生幻读。
4. 串行化(Serializable)
-
Read View:
- 不使用 Read View。
- 通过加锁(如共享锁、排他锁)实现事务隔离。
-
可见性规则:
- 每次读取时都会加锁,确保当前读操作的可见性。
- 因为加锁阻塞了其他事务的修改或读取,因此不存在不可见的问题。
-
特点:
- 防止脏读、不可重复读和幻读。
- 并发性能较低,但数据一致性最高。
整体工作流程
-
事务修改数据时:
- 写入 Undo Log,保存旧版本数据。
- 更新
DB_TRX_ID
和DB_ROLL_PTR
。
-
事务执行快照读时:
- 生成 Read View,记录当前系统中活跃事务列表。
- 判断数据版本是否可见:
- 若不可见,使用
DB_ROLL_PTR
查找历史版本。
- 若不可见,使用
-
事务提交时:
- Insert Undo Log 可直接删除。
- Update Undo Log 保留,用于支持其他事务的快照读。
-
事务回滚时:
- 通过 Undo Log 恢复旧版本数据,撤销事务的影响。
总结
-
MVCC 是 InnoDB 存储引擎中实现事务隔离和提高并发性能的关键机制。
-
通过维护多个数据版本和 Undo Log,实现快照读和当前读,避免了大量加锁操作。
-
Undo Log:
- 是 MVCC 的基础,记录旧版本数据,支持事务回滚和快照读。
- 分类为 Insert Undo Log 和 Update Undo Log。
-
Read View:
- 确保快照读的隔离性,通过可见性算法判断数据版本是否可见。
- 隔离级别的不同会影响 Read View 的生成时机。
-
两者配合:
- Undo Log 提供数据的历史版本,Read View 判断哪些版本对当前事务可见,共同实现事务的并发控制和一致性。
MVCC 的优点
-
提高并发性能:
- 快照读不需要加锁,避免了读写之间的冲突。
-
减少锁开销:
- 大量读操作可以通过读取历史版本完成,无需加锁,提高效率。
-
支持事务隔离:
- MVCC 能够在不同的隔离级别下提供一致的数据读取。
MVCC 的局限性
-
占用存储空间:
- Undo Log 的存在会增加存储开销,特别是长事务会导致 Undo Log 增长。
-
长事务的性能问题:
- 长事务可能会导致 Undo Log 不能被及时清理,增加性能开销。
-
仅适用于读写混合场景:
- 如果事务中大量是写操作,MVCC 的优势会减弱,因为写操作仍需加锁。
示例:MVCC 的快照读
1. 表结构
CREATE TABLE orders (id INT AUTO_INCREMENT PRIMARY KEY,status VARCHAR(20)
);
2. 插入数据
INSERT INTO orders (status) VALUES ('pending'), ('shipped'), ('delivered');
3. 启动事务并模拟并发查询
事务 A:
START TRANSACTION;
SELECT * FROM orders; -- 快照读,读取事务开始时的版本
UPDATE orders SET status = 'cancelled' WHERE id = 1; -- 当前读,修改最新版本
事务 B:
START TRANSACTION;
SELECT * FROM orders WHERE id = 1; -- 读取事务 A 修改前的快照版本
结果:
- 事务 A 在事务 B 提交之前,可以看到修改后的状态。
- 事务 B 在事务 A 提交之前,读取的是修改前的状态。
历史文章
- MySQL数据库笔记——数据库三范式
- MySQL数据库笔记——存储引擎(InnoDB、MyISAM、MEMORY、ARCHIVE)
- MySQL数据库笔记——常见的几种锁分类
- MySQL数据库笔记——索引介绍
- MySQL数据库笔记——事务介绍
- MySQL数据库笔记——索引结构之B+树
- MySQL数据库笔记——索引潜规则(回表查询、索引覆盖、索引下推)
- MySQL数据库笔记——索引潜规则(最左前缀原则)
- MySQL数据库笔记——常见慢查询优化方式
- MySQL数据库笔记——日志介绍
相关文章:
MySQL数据库笔记——多版本并发控制MVCC
大家好,这里是Good Note,关注 公主号:Goodnote,本文详细介绍MySQL的并发控制:多版本并发控制MVCC。 文章目录 背景介绍数据库并发控制——锁机制悲观锁和乐观锁悲观锁乐观锁 数据库并发控制——MVCC 的引入MVCC 和锁机…...
【LLM综述】29种大模型Prompt Engineering技术
note 从零样本(Zero-shot)提示到最新进展的各种提示技术,包括推理和逻辑链(Chain-of-Thought, CoT)提示、自动链式思考(Auto-CoT)提示、自我一致性(Self-Consistency)提…...
MySQL高级关联查询与复杂关系的处理
在关系型数据库的操作中,复杂关联查询和多层次关系建模是非常重要的技能。无论是在数据分析、业务数据处理,还是在数据可视化等各个方面,处理多表数据关联都是不可或缺的部分。通过高效的关联查询,可以在不同表之间建立关系,查询并整合多张表的数据,避免数据冗余并提升查…...
URL Moniker API
1. urlmon 介绍 urlmon 是指 URL Moniker API,它是 Microsoft Windows 操作系统中的一部分,通常用于处理 URL 和相关的任务。urlmon.dll 是其动态链接库,提供了一系列函数和接口,主要用于以下目的: URL 分析和处理&a…...
单元测试3.0+ @RunWith(JMockit.class)+mock+Expectations
Jmockit使用笔记_基本功能使用Tested_Injectable_Mocked_Expectations_jmockit.class-CSDN博客 测试框架Jmockit集合junit使用 RunWith(JMockit.class) 写在测试案例类上的注解 Tested 在测试案例中,写在我们要测试的类上面, 一般用实现类 Injectable 在测试案例中声明…...
halcon中图像滤波分为空间域和频域两种方法
均值滤波是一种线性平滑滤波。基本思想是用某像素邻域几个像素的平均值代替此像素原来的灰度值。 高斯滤波是用某像素邻域几个像素的加权平均值代替此像素的原有灰度值。 总结:图像滤波分为空间域和频域两种方法。 空间域滤波主要是对像素的直接处理,它将…...
maxminddb地理信息库–C语言
原文地址:maxminddb地理信息库–C语言 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 maxminddb 是一个 IP 的地理信息库,可以根据 IP 地址给出对应的地理位置信息。 下载离线库 maxminddb提供在线查询,也…...
Keil中的gcc
文章目录 一、IDE背后的命令1.1 IDE是什么1.2 IDE的背后是命令1.3 有两套主要的编译器 二、准备工作2.1 arm-linux-gcc和gcc是类似的2.2 Code::Blocks2.2.1 设置windows环境变量2.2.2 命令行示例 三、gcc编译过程详解3.1 程序编译4步骤3.2 gcc的使用方法3.2.1 gcc使用示例3.2.2…...
【Java数据结构】栈和队列相关算法
第一题:改变元素的序列 例1:若进栈序列为1,2,3,4,进栈过程中可以出栈,则下列不可能一个出栈序列(); A:1,4,3,…...
LoRA微调系列笔记
系列文章目录 第一章:LoRA微调系列笔记 第二章:Llama系列关键知识总结 第三章:LLaVA模型讲解与总结 文章目录 系列文章目录LoRA:Low-Rank Adaptation of Large Language Models目的:依据:优势:…...
Linux(Ubuntu)下ESP-IDF下载与安装完整流程(3)
接前一篇文章:Linux(Ubuntu)下ESP-IDF下载与安装完整流程(2) 本文主要看参考官网说明,如下: 快速入门 - ESP32-S3 - — ESP-IDF 编程指南 latest 文档 Linux 和 macOS 平台工具链的标准设置 - ESP32-S3 - — ESP-IDF 编程指南 latest 文档 一、安装准备 1. Linux用...
【C++】22___STL常用算法
目录 一、常用遍历算法 二、常用查找算法 2.1 find 2.2 其它查找算法 三、常用排序算法 3.1 sort 3.2 其它排序算法 四、拷贝 & 替换 4.1 copy 4.2 其它算法 五、常用的算数生成算法 5.1 accumulate 5.2 fill 六、常用集合算法 6.1 set_intersection 6…...
linux 批量替换文件指定字符串
启发:数据库连接串的用户名需要从sa修改为sasa find . -type f -name mssql.json -exec sed -i s/IDsa;/IDsasa;/g {}...
List接口(源码阅读)
文章目录 1.List接口常用方法1.代码2.结果 2.ArrayList底层机制1.结论2.ArrayList底层源码1.代码2.debug添加第一个元素1.进入2.elementData数组存储ArrayList的数据3.初始化为空数组4.首先确保使用size1来计算最小容量5.如果elementData为空,最小容量就是106.modCo…...
股市学习 seekingalpha tradingview
EMA EMA(Exponential Moving Average)是一种技术分析中常用的指标,用于平滑股价或其他资产价格的波动,以帮助分析价格走势的趋势和方向。EMA与简单移动平均(SMA)类似,但对最新价格的权重更大&a…...
用再生龙备份和还原操作系统(三)
续上篇《用再生龙备份和还原操作系统(二)》 三,用再生龙将镜像文件还原到硬盘 将再生龙工具盘、待还原系统的硬盘(与源盘一样大或更大)、镜像文件所在磁盘(如果是U盘,也可以后插)安…...
FaceFusion 从0开始本地部署,RTX4060
FaceFusion 从0开始本地部署指南 一、环境准备 1. 基础工具安装 1.1 Git 安装 使用管理员权限打开 PowerShell执行安装命令: winget install -e --id Git.Git验证安装: git --version1.2 FFmpeg 安装 使用管理员权限打开 PowerShell执行安装命令&…...
Swift Combine 学习(六):自定义 Publisher 和 Subscriber
Swift Combine 学习(一):Combine 初印象Swift Combine 学习(二):发布者 PublisherSwift Combine 学习(三):Subscription和 SubscriberSwift Combine 学习(四&…...
服务器网卡绑定mode和交换机的对应关系
互联网各领域资料分享专区(不定期更新): Sheet 模式类别 网卡绑定mode共有七种(0~6): bond0、bond1、bond2、bond3、bond4、bond5、bond6 mode详解 mode0 ,即:(balance-rr) Round-robin policy(平衡轮循环策略,需要配置交换机静态聚合) mode…...
【动手学轨迹预测】2.4 考虑地图拓扑关系的表征方法
上一节我们介绍了VectorNet提出了矢量化场景表征方法, 大幅提高了预测网络编码性能. 但是VectorNet对地图数据的编码是基于无向无权图的, 并没有考虑到地图的拓扑关系. 显然在预测中, 地图的拓扑关系应该被考虑到. 于是在VectorNet的基础上, LaneGCN提出一种将地图车道作为节点…...
ChatGLM3模型搭建(踩坑记录版)
参考 魔搭社区 https://zhuanlan.zhihu.com/p/720148240 智谱AI通用大模型:本地部署ChatGLM3-6B开源大模型 - 编程库 说明 搭建方式多篇文章结合着看; 模型下载强烈推荐魔塔社区下载ZhipuAI/chatglm3-6b; 官方github指定清华的模型没有…...
基于 Python Django 的花卉商城系统的研究与实现
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
Spring Boot 3 文件下载、多文件下载以及大文件分片下载、文件流处理、批量操作 和 分片技术
在 Spring Boot 3 中,实现文件下载、多文件下载以及大文件分片下载需要结合以下功能:文件流处理、批量操作 和 分片技术。以下是详细实现方案: 1. 单文件下载 基础的单文件下载实现,可以参考以下代码: GetMapping(&…...
什么是事件循环(Event Loop)?请谈谈它在 JavaScript 中的作用?
事件循环(Event Loop)是什么? 事件循环(Event Loop)是JavaScript运行时环境(如浏览器或Node.js)中的一个核心机制,用于处理异步操作和事件。 它负责协调代码的执行、事件的处理、以…...
Lua : Coroutine(协程)
Lua 协程(coroutines)是一种强大的控制结构,允许函数在执行过程中暂停并在稍后恢复。与线程不同,协程是非抢占式的,这意味着它们不会被操作系统调度,而是由程序显式地切换。协程在 Lua 中非常有用ÿ…...
【2024华为OD-E卷-200分-跳格子2】(题目+思路+JavaC++Python解析)
题目描述 在一个二维平面上,有一个 n x m 的网格,每个格子有一个非负整数。你从左上角 (0, 0) 开始,每次只能向右或向下移动,目标是到达右下角 (n-1, m-1)。 在移动过程中,你需要记录经过的格子中,最大数…...
【仓颉语言基础】语言概念、环境配置与语法解析
华为仓颉语言是一门专为分布式系统设计的现代编程语言,以简洁的语法和强大的分布式能力为核心,提供高效的资源管理和任务调度方案。本篇文章将带您从概念入手,逐步掌握环境配置与语法基础,为分布式开发奠定坚实基础。 文章目录 一…...
LeetCode - 初级算法 数组(删除排序数组中的重复项)
免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 删除排序数组中的重复项 这篇文章讨论如何从一个非严格递增的数组 nums 中删除重复的元素,使每个元素只出现一次,并返回新数组的长度。因为数组是排序的,只要是相同的肯定是挨着的,所以我们需要遍历所有数组,然…...
SpringMVC进阶(自定义拦截器以及异常处理)
文章目录 1.自定义拦截器 1.基本介绍 1.说明2.自定义拦截器的三个方法3.流程图 2.快速入门 1.Myinterceptor01.java2.FurnHandler.java3.springDispatcherServlet-servlet.xml配置拦截器4.单元测试 3.拦截特定路径 1.拦截指定路径2.通配符配置路径 4.细节说明5.多个拦截器 1.执…...
2 秒杀系统架构
第一步 思考面临的问题和业务场景 秒杀系统面临的问题: 短时间内并发非常高,如果按照秒杀的并发做相应的承载会造成大量资源的浪费。第二解决超卖的问题。 第二步 思考目前的处境和解决方案 因为秒杀系统属于短时间内的高并发问题,我们不可能使用那么…...
C++如何遍历数组vector
在C中,vector是一个可变数组。那么怎么遍历它呢?我们以for循环为例(while循环,大家自己脑补)。 方法一: 基于范围的for循环,这是C11新引入的。 std::vector<int> v {1, 2, 3, 4, 5, 6…...
ubuntu非root用户操作root权限问题-virbox挂在共享文件夹
首先讲一下,virtuallbox 挂在文件夹,操作的时候总是需要root权限,比较费劲。 这一操作其实也正对着我们在Ubuntu上的操作。 前段时间我想在ubuntu正常用户下去操作i2c,也出现了类似的问题。 后来把正常的操作加到组里面也解决了类…...
大模型推理:vllm多机多卡分布式本地部署
文章目录 1、vLLM分布式部署 docker镜像构建通信环境配置 2、其他大模型部署工具3、问题记录参考文献 单台机器GPU资源不足以执行推理任务时,一个方法是模型蒸馏量化,结果就是会牺牲些效果。另一种方式是采用多台机器多个GPU进行推理,资源不…...
WFP Listbox绑定数据后,数据变化的刷新
Listbox绑定数据通过ItemsSource来的,如果绑定的是普通的List<数据>,不会自己刷新。 使用ObservableCollection集合 解决问题的方法: 将数组替换为 ObservableCollection ObservableCollection 是专为绑定设计的集合类型,可以通知 W…...
AI + 爬虫:智能化数据采集的未来
随着人工智能(AI)技术的不断进步,传统的网络爬虫正经历一场前所未有的变革。从规则驱动到智能化演变,AI 的引入不仅提高了爬虫的效率和适应性,更为大规模数据采集提供了全新思路。本文将深入探讨 AI 与爬虫的结合&…...
人工智能知识分享第五天-正则化.损失函数案例
正则化 欠拟合与过拟合 过拟合:一个假设 在训练数据上能够获得比其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据 (体现在准确率下降),此时认为这个假设出现了过拟合的现象。(模型过于复杂) 欠拟合:一个假设 在训…...
WebRTC的线程事件处理
1. 不同平台下处理事件的API: Linux系统下,处理事件的API是epoll或者select;Windows系统下,处理事件的API是WSAEventSelect,完全端口;Mac系统下,kqueue 2. WebRTC下的事件处理类: …...
C++软件设计模式之迭代器模式
迭代器模式是一种行为设计模式,它允许你顺序访问一个聚合对象的元素,而不暴露其底层表示。在C软件设计中,迭代器模式的主要目的是将数据的遍历行为与数据结构本身分离,使得数据结构的修改不会影响到遍历代码。 目的和意图 解耦遍…...
git reset --hard(重置到当前提交,所有未提交的更改都会被永久丢弃)
git reset --hard 是一个强大的命令,它会将你的工作目录、暂存区和当前分支的 HEAD 指针重置到指定的提交状态,所有未提交的更改都会被永久丢弃。因此,使用这个命令时需要非常小心。 基本用法 重置到当前提交(丢弃所有未提交的更…...
三分钟在你的react项目中引入tailwindcss
前言:在vite搭建的react项目中引入并使用tailwindcss 一、初始化react项目 1、创建项目 在文件夹下右键打开终端并输入命令使用vite创建项目 pnpm create vite react-tailwind选择reactjavascript,并输入命令安装依赖并启动 2、安装tailwind pnpm …...
Android Studio学习笔记
01-课程前面的话 02-Android 发展历程 03-Android 开发机器配置要求 04-Android Studio与SDK下载安装 05-创建工程与创建模拟器...
19712 数字接龙
/*我觉得重要的理解点:1.四维数组白表示一个点从另一个点沿对角线的方式进行移动,如果这个元素的值为真则表示这样的移动存在。 2.按照0->k-1的顺序移动。这个要求的实现方法也值得学习 3.count和index的含义: index表示索引,表…...
【图像去噪】论文复现:大道至简!ZS-N2N的Pytorch源码复现,跑通源码,获得指标计算结果,补充保存去噪结果图像代码,代码实现与论文理论对应!
请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 完整代码和训练好的模型权重文件下载链接见本文底…...
Linux-mac地址
mac地址 由6位16进制数组成。最高字节的最低位,0表示单播地址,1表示多播地址。最高字节的第二位,0表示全局地址,1表示本地地址。 单播地址:单播MAC地址用于一对一的通信模式,即从单一的源端发送到单一的目…...
旷视科技Java面试题及参考答案
讲一下进程间的通讯方式(如管道、消息队列、共享内存、Socket 等),各有什么特点? 管道(Pipe) 管道是最早出现的进程间通信方式之一,主要用于具有亲缘关系(父子进程)的进程之间通信。 特点: 半双工通信,数据只能单向流动。例如,在一个简单的父子进程通信场景中,父进…...
【无线传感网】WSN数据管理技术
文章目录 WSN数据管理的基本概念以数据为中心的WSN数据库与分布式数据库相比具有的特殊性WSN数据管理技术的研究热点 WSN数据管理的关键技术无线传感器网络数据存储结构网外集中式存储方案网内分层存储方案网内本地存储方案以数据为中心的网内存储方案 数据查询处理技术查询类型…...
硬件基础知识笔记(2)——二级管、三极管、MOS管
Part 2 二级管、三极管、MOS管 1、二级管1.1肖特基二极管和硅二极管选型比较1.2到底是什么决定了二极管的最高工作频率?1.3二极管结电容和反向恢复时间都是怎么来的 1、二级管 1.1肖特基二极管和硅二极管选型比较 肖特基二极管的优势主要在速度和压降,对…...
记录uniapp组件swiper自适应高度
在uniapp组件swiper不能自适应高度 思路: 根据传的图片,进行图片分析宽高, 根据屏幕尺寸,进行换算对应的宽高比。 最后获得图片尺寸,进行赋值。 <swiper class="swiper" :style="{ height: `${swiperheight}` + px }" @change="onSwiperC…...
Presto-简单了解-230403
presto是什么了解一下: 秒级查询引擎(不做存储),GB-PB级不依赖于yarn,有自己的资源管理和执行计划支持多种数据源:hive、redis、kafka presto架构 presto优缺点 presto优点 内存到内存的传输࿰…...
Windows Knowledge
1 GRUB简介 1.1 MBR和PBR MBR分为GRUB.MBR和DOS.MBR。 由于硬盘上扇区从偏移0到偏移62属于同一个磁道0,虽然DOS.MBR仅占用一个扇区,但是需要将DOS.MBR后面的偏移1到偏移62保留,所以磁盘上第一个分区的第一个扇区是从偏移63开始的。fbinst软件…...