MySQL核心机制:日志系统、锁机制与事务管理的深度剖析
一.介绍
MySQL作为世界上最流行的开源关系型数据库之一,其强大的事务处理能力和高并发支持使其在各种复杂应用场景中得到广泛应用。MySQL的核心机制包括日志系统、锁机制和事务管理,这些机制共同确保了数据库的ACID特性,为应用程序提供了可靠的数据存储和处理环境。本报告将深入剖析MySQL的日志系统、锁机制和事务管理,为高级工程师提供全面的技术洞察。
MySQL日志系统
MySQL的日志系统是数据库可靠性、性能和一致性的重要保障。主要的日志包括Redo Log、Bin Log和Undo Log,它们各自承担不同的职责,在数据库的崩溃恢复、数据复制和事务回滚等方面发挥关键作用。
Redo Log:重做日志
Redo Log是InnoDB存储引擎独有的日志类型,它让MySQL拥有了崩溃恢复能力。当MySQL实例挂机或宕机时,重启时InnoDB存储引擎会使用Redo Log恢复数据,保证数据的持久性和完整性。
Redo Log记录了所有对数据库的修改操作,包括更新、插入和删除。这些修改首先被写入Redo Log缓冲区,然后在一定条件下被刷新到磁盘。Redo Log的刷盘策略遵循以下规则:
- 当Redo Log缓冲区满时,必须将日志写入磁盘
- 当事务提交时,Redo Log会被写入磁盘
- 当InnoDB检查点生成时,Redo Log会被写入磁盘
Redo Log的物理结构包括以下几个部分:
- 文件头:包含日志组ID、文件起始LSN(日志序列号)、备份信息等元数据
- 日志内容:按BLOCK为单位分割,每个BLOCK大小默认为512字节
- 检查点信息:记录InnoDB checkpoint信息,帮助恢复过程确定数据状态
Redo Log采用环形缓冲区设计,由多个文件组成,使用双缓冲技术以提高写入性能。每个InnoDB存储引擎至少有一个重做日志文件组,每个文件组至少包含两个重做日志文件,如默认的iblogfile0和iblogfile1。通过合理配置Redo Log的大小和数量,可以显著提升数据库的写入性能。
innodb_log_file_size:指定每个redo日志文件的大小,通常建议设置为1G或更大
innodb_log_files_in_group:指定日志文件组中redo日志文件的数量,通常设置为2
innodb_log_group_home_dir:指定日志文件组所在路径
Bin Log:二进制日志
Bin Log(逻辑日志)是MySQL Server层维护的一种二进制日志,与InnoDB引擎中的Redo Log(物理日志)不同。Bin Log主要用于记录所有数据库表结构变更以及数据修改的操作(记录的是 SQL 或行级别的变更),不记录SELECT、SHOW等查询操作。
Bin Log以"事务"的形式保存在磁盘中,包含语句执行的消耗时间等元信息。Bin Log的主要应用场景包括:
- 主从复制:Bin Log是MySQL主从复制的基础,Master节点的Bin Log会被Slave节点拉取并执行
- 数据恢复:通过分析Bin Log,可以恢复到特定时间点的数据状态
Bin Log有三种记录模式,可以根据具体需求进行选择: - ROW模式:记录每一行数据被修改的情况,然后在Slave端对相同的数据进行修改。这种方式能够完全实现数据同步和数据恢复,但会产生大量的日志,消耗较多资源。
- STATEMENT模式:每一条被修改数据的SQL都会被记录到Master的Bin Log中,Slave在复制时会解析并执行相同的SQL。这种方式日志量少,减少了IO,提升了存储和恢复速度,但在某些情况下可能导致主从数据不一致。
- MIXED模式:以上两种模式的混用,MySQL会根据执行的SQL语句自动选择合适的写入模式。
Bin Log的文件名默认采用"主机名-binlog-序列号"的格式,也可以在配置文件中指定名称。Bin Log文件的内容由各种Log Event组成,不同的修改操作对应不同的Log Event,常用的有Query Event、Row Event、Xid Event等。
log_bin:启用二进制日志,设置为ON
binlog_format:指定二进制日志的格式,可选值包括ROW、STATEMENT、MIXED
max_binlog_cache_size:指定二进制日志缓存的最大大小
max_binlog_size:指定单个二进制日志文件的最大大小
Undo Log:撤销日志(原子性)
Undo Log是InnoDB引擎用来处理事务的重要机制,它记录了数据的变更历史,以便在事务失败或需要回滚时恢复数据到原来的状态。
当开启一个事务但未提交时,事务中的修改操作可能会出现错误或异常,此时可以通过Undo Log将事务中的操作进行回滚。Undo Log只记录事务中的增删改操作,不记录查询操作,因为查询不会修改数据。
Undo Log的物理结构包括以下几个部分:
- Undo日志段:Undo日志的集合,包含在回滚段中
- 回滚段:包含Undo日志的存储区域,通常位于系统表空间中
- 活动事务的修改数据副本:保存在Undo Log中,用于回滚时恢复数据
从MySQL 5.6开始,回滚段可以存储在 Undo 表空间中,从MySQL 5.7开始,回滚段也被分配到全局临时表空间。InnoDB最多支持128个回滚段,其中有1个回滚段用于系统表空间,32个回滚段位于临时表空间,剩余的95个用于Undo表空间。
innodb_rollback_segments:指定回滚段的个数
innodb_undo_tablespaces:指定Undo表空间的个数
MySQL锁机制
锁机制是数据库在并发访问时保证数据一致性和完整性的主要手段。MySQL的锁机制非常复杂,根据加锁的范围,MySQL中的锁大致可以分成全局锁、表级锁和行级锁三类。
全局锁
全局锁是对整个数据库实例加锁,最典型的全局锁是Flush Tables With Read Lock (FTWRL)命令。当你需要让整个库处于只读状态时,可以使用这个命令,之后其他线程的数据更新语句、数据定义语句和更新类事务的提交语句会被阻塞。
全局锁的典型应用场景是做全库逻辑备份。也就是把整库每个表都SELECT出来存成文本。全局锁的开销和加锁时间界于表级锁和行级锁之间,会出现死锁,锁定粒度也界于表级锁和行级锁之间,整体并发度一般。
表级锁
表级锁锁定整个表,主要用于MyISAM存储引擎。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
表级锁的具体细分包括:
- 表锁:可以分为表共享读锁和表独占写锁
- 表共享读锁:一旦某个客户端给表加了共享读锁,它只能够读不能写,且不会阻塞其他客户端的读操作
- 表独占写锁:一旦某个客户端给表加了独占写锁,其他客户端既不能读也不能写,但不会阻塞其他客户端的锁请求
- 元数据锁:与表的结构变更相关,当执行ALTER TABLE等操作时会加元数据锁
- 意向锁:InnoDB存储引擎特有的锁类型,用于表示事务意图对某资源加锁
- 意向共享锁(IS锁):表示事务意图对某资源加共享锁
- 意向排他锁(IX锁):表示事务意图对某资源加排他锁
行级锁
行级锁是InnoDB存储引擎支持的最精细的锁类型,只有InnoDB引擎支持行级锁,而且锁是加在索引上的。行级锁的开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。
行级锁的具体细分包括:
- 记录锁(Record Lock):锁定单个表中的单个行记录,这是最常见的行级锁类型
- 共享锁(S锁):允许并发事务读取同一行,但阻止写入
- 排他锁(X锁):阻止其他事务读取或修改同一行
- 间隙锁(Gap Lock):锁定一个范围(记录之间的间隙)内的所有记录,但不锁定记录本身
- 主要用于防止幻读,确保事务在锁定范围内的记录不会被其他事务插入
- 临键锁(Next-Key Lock):是记录锁和间隙锁的组合,锁定记录本身及其前面的间隙
- 这是MySQL默认的行锁实现方式,可以防止幻读
行级锁的具体行为受多种因素影响,包括隔离级别、锁模式和访问模式等。在可重复读隔离级别下,InnoDB默认使用临键锁来防止幻读。
- 这是MySQL默认的行锁实现方式,可以防止幻读
-- 显示当前系统中的锁信息
SHOW ENGINE INNODB STATUS;
MySQL事务隔离级别
事务隔离级别是数据库系统中用于控制事务之间相互影响程度的机制。MySQL提供了四种隔离级别,从低到高依次为:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。默认情况下,MySQL使用可重复读隔离级别。
读未提交(Read Uncommitted)
这是最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。在这种隔离级别下,事务中的查询不会加任何锁,只在修改数据时加排他锁。
读未提交隔离级别主要适用于以下场景:
- 读多写少的场景,且数据一致性要求不高
- 需要尽可能高的并发度
- 愿意容忍数据不一致的情况
读已提交(Read Committed)
允许读取并发事务已经提交的数据,可以阻止脏读,但幻读或不可重复读仍有可能发生。在这种隔离级别下,事务中的查询会加共享锁,读取完成后立即释放锁。
读已提交隔离级别是Oracle数据库的默认隔离级别,主要适用于以下场景:
- 读多写少的场景,且数据一致性要求较高
- 需要避免脏读的发生
- 愿意接受一定程度的锁竞争
可重复读(Repeatable Read)
这是MySQL的默认隔离级别。可重复读保证对同一字段的多次读取结果都是一致的,除非数据是被事务自己所修改。它可以阻止脏读和不可重复读,但幻读仍有可能发生。
可重复读隔离级别主要适用于以下场景:
- 标准的OLTP应用,需要较高的数据一致性
- 需要避免脏读和不可重复读的发生
- 愿意接受幻读的风险
串行化(Serializable)
这是最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰。这种隔离级别可以防止脏读、不可重复读以及幻读,但也会带来最大的锁竞争和并发性能损失。
串行化隔离级别主要适用于以下场景:
- 对数据一致性要求极高的应用
- 需要完全避免并发问题
- 并发度较低的应用场景
不同隔离级别的特性对比:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 允许 | 允许 | 允许 |
读已提交 | 防止 | 允许 | 允许 |
可重复读 | 防止 | 防止 | 允许 |
串行化 | 防止 | 防止 | 防止 |
MySQL事务的ACID特性
事务的ACID特性是数据库系统确保数据准确性和可靠性的四大支柱。这些特性共同构成了事务管理的基石,保障了数据的原子性、一致性、隔离性和持久性。
原子性(Atomicity)
原子性保证事务是一个原子操作单元,其对数据的修改要么全都执行,要么全都不执行。在MySQL中,原子性通过以下机制实现:
- 事务中的所有操作都必须记录在Redo Log中
- 事务提交时执行"两阶段提交"协议
- 第一阶段:将提交请求写入Redo Log
- 第二阶段:将数据修改写入数据文件
如果在第一阶段完成后但第二阶段完成前系统崩溃,MySQL会在重启时回滚未完成的事务。
一致性(Consistent)
一致性保证在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性。
MySQL通过以下机制保证一致性:
- 外键约束:确保引用完整性
- 检查约束:确保行级数据有效性
- 事务隔离:防止并发访问导致的不一致状态
隔离性(Isolation)
隔离性保证数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的独立"环境"中执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
MySQL通过以下机制实现隔离性:
- 锁机制:控制对数据的并发访问
- 多版本并发控制(MVCC):允许不同事务看到数据库的不同版本
- 事务隔离级别:控制不同事务之间的可见性规则
持久性(Durability)
持久性保证一旦事务提交,所做的修改将会永久保存到数据库中,即使系统发生故障也不会丢失。
MySQL通过以下机制保证持久性:
- Redo Log:记录所有修改操作,确保崩溃恢复时数据不丢失
- Checkpoint机制:定期将修改写入数据文件
- Fsync操作:确保数据被写入物理磁盘
MySQL的多版本并发控制(MVCC)
多版本并发控制(MVCC)是MySQL实现高并发读写的核心机制,特别是在InnoDB存储引擎中。MVCC允许不同事务看到数据库的不同版本,从而实现非锁定读,大大提高了系统的并发性能。
Read View与版本链
Read View是事务在启动时创建的一张快照,它记录了当前系统中所有活跃事务的ID。当事务访问数据时,会根据Read View判断数据版本的可见性。
版本链是与表相关的数据结构,它记录了表中所有行的多个版本。每个行版本包含以下信息:
- 行数据的物理位置
- 事务ID:创建该行版本的事务ID
- 删除标志:指示该行是否被删除
当一个事务修改一行数据时,InnoDB会创建一个新的行版本,而不是直接覆盖旧版本。旧版本会保留在版本链中,直到不再需要为止。
快照读与当前读
快照读(Snapshot Read)是基于Read View的读操作,它看到的是事务启动时数据库的状态,不会加锁。快照读主要用于普通的SELECT查询,是MySQL实现高并发读的关键。
当前读(Current Read)是直接读取最新版本数据的读操作,它会加锁以确保数据的一致性。当前读主要有以下几种情况:
- 更新操作(UPDATE):需要读取当前最新版本的数据,然后进行修改
- 插入操作(INSERT):需要检查主键或唯一索引是否存在冲突
- 唯一性检查:在某些特定查询中,需要确保数据的唯一性
快照读与当前读的主要区别在于:
| 特性 | 快照读 | 当前读 |
|—|—|—|
| 加锁机制 | 不加锁 | 加锁 |
| 可见性 | 基于Read View的快照 | 看到最新提交的数据 |
| 一致性 | 不可重复读可能发生 | 不可重复读不会发生 |
| 性能影响 | 高并发 | 低并发 |
MVCC与隔离级别的关系
MVCC的实现与事务隔离级别密切相关,不同隔离级别下,MVCC的行为有所不同:
- 读未提交:不使用MVCC,直接读取最新版本的数据
- 读已提交:使用MVCC,但Read View在每次查询时动态创建
- 可重复读:使用MVCC,Read View在事务开始时创建,整个事务期间保持不变
- 串行化:不使用MVCC,所有读操作都加锁
在可重复读隔离级别下,MVCC通过以下机制防止脏读、不可重复读和幻读:
- 防止脏读:通过Read View确保只能看到已提交的事务版本
- 防止不可重复读:通过Read View在事务开始时创建,保持整个事务期间不变
- 防止幻读:通过Next-Key Lock机制锁定记录之间的间隙,防止新记录插入
MySQL事务管理的实现机制
MySQL事务管理的实现涉及多个核心组件和机制,包括日志系统、锁机制和事务控制结构等。这些机制共同确保了事务的ACID特性。
事务日志机制
MySQL使用Redo Log和Undo Log来记录事务的修改操作,确保事务的原子性和持久性。
Redo Log记录了所有修改操作,确保在系统崩溃后可以重放这些修改。Undo Log记录了事务修改前的数据状态,支持事务的回滚。
当事务提交时,MySQL会执行两阶段提交:
- 第一阶段:将提交请求写入Redo Log
- 第二阶段:将修改写入数据文件
如果在第一阶段完成后但第二阶段完成前系统崩溃,MySQL会在重启时回滚未完成的事务。
锁管理机制
MySQL的锁管理器负责维护和管理各种锁资源,包括全局锁、表级锁和行级锁。锁管理器需要处理以下任务:
- 锁的申请和释放
- 死锁检测和处理
- 锁超时管理
- 锁冲突的处理
MySQL使用多种锁类型来实现事务的隔离性:
- 共享锁(S锁):允许并发读取
- 排他锁(X锁):阻止其他事务读取或修改
- 意向锁:用于表示事务意图对某资源加锁
- 间隙锁:锁定记录之间的间隙,防止幻读
事务控制结构
MySQL维护了多种事务控制结构,包括:
- 事务系统缓存:保存当前活动事务的信息
- 回滚段:保存事务的回滚信息
- 事务队列:管理事务的提交顺序
- 事务日志:记录事务的修改操作
当事务提交时,MySQL会将修改操作记录到Redo Log和Bin Log中,并更新数据文件。当事务回滚时,MySQL会使用Undo Log将数据恢复到修改前的状态。
MySQL并发控制的实践建议
在实际应用中,合理配置和使用MySQL的并发控制机制至关重要。以下是一些实践建议:
日志配置建议
- Redo Log配置:
- 增大innodb_log_file_size参数,建议设置为1G或更大
- 调整innodb_log_files_in_group参数,通常设置为2
- 将Redo Log文件放在独立的磁盘分区,提高IO性能
- Bin Log配置:
- 合理选择binlog_format参数,根据具体需求选择ROW、STATEMENT或MIXED
- 配置适当的max_binlog_cache_size和max_binlog_size参数
- 定期清理旧的Bin Log文件,防止磁盘空间耗尽
- Undo Log配置:
- 调整innodb_rollback_segments参数,增加回滚段数量
- 配置innodb_undo_tablespaces参数,将Undo Log放在独立的表空间
锁管理建议
- 表结构设计:
- 合理设计主键和索引,减少锁竞争
- 避免热点数据,防止单点锁竞争
- 使用合理的数据类型,减少数据更新操作
- 事务设计:
- 缩小事务范围,减少锁定资源的数量
- 尽量减少大事务,避免长时间持有锁
- 合理设置隔离级别,平衡一致性与性能
- 查询优化:
- 使用合适的索引,减少查询时间
- 避免全表扫描,减少表级锁的使用
- 优化事务中的SQL语句,减少资源竞争
隔离级别选择建议
- 读未提交(Read Uncommitted):
- 适用于数据一致性要求低的场景
- 适用于读多写少的场景
- 注意脏读、不可重复读和幻读的风险
- 读已提交(Read Committed):
- 适用于大多数OLTP应用
- 能够避免脏读,但可能发生不可重复读和幻读
- 比可重复读产生更多的锁竞争
- 可重复读(Repeatable Read):
- MySQL默认隔离级别
- 能够避免脏读和不可重复读,但可能发生幻读
- 幻读问题可以通过Next-Key Lock机制解决
- 串行化(Serializable):
- 适用于数据一致性要求极高的场景
- 会导致大量的锁竞争,降低系统并发性能
- 仅在特定场景下使用,如银行交易等高一致性要求场景
感谢你看到这里,喜欢的可以点点关注哦!
相关文章:
MySQL核心机制:日志系统、锁机制与事务管理的深度剖析
一.介绍 MySQL作为世界上最流行的开源关系型数据库之一,其强大的事务处理能力和高并发支持使其在各种复杂应用场景中得到广泛应用。MySQL的核心机制包括日志系统、锁机制和事务管理,这些机制共同确保了数据库的ACID特性,为应用程序提供了可靠…...
Mybatis标签使用 -association 绑定对象,collection 绑定集合
注意 association标签中的 select , column 属性使用 collection 标签中的 ofType 属性使用 Data public class Tours implements Serializable {private static final long serialVersionUID 1L;private Integer touId;private String tourName;private Integer guideId;pri…...
IBM BAW(原BPM升级版)使用教程Toolkit介绍
本部分为“IBM BAW(原BPM升级版)使用教程系列”内容的补充。 一、系统Toolkit 在 IBM Business Automation Workflow (BAW) 中,System Toolkit 是一组预先定义和配置好的工具、功能和组件,旨在帮助流程设计者和开发人员快速构建…...
排列组合算法:解锁数据世界的魔法钥匙
在 C 算法的奇幻世界里,排列和组合算法就像是两把神奇的魔法钥匙,能够帮我们解锁数据世界中各种复杂问题的大门。今天,作为 C 算法小白的我,就带大家一起走进排列和组合算法的奇妙天地。 排列算法:创造所有可能的顺序…...
LVGL -meter的应用
1 meter介绍 lv_meter 是 LVGL v8 引入的一种图形控件,用于创建仪表盘样式的用户界面元素,它可以模拟像速度表、电压表、温度表这类模拟表盘。它通过可视化刻度、指针、颜色弧线等来展示数值信息,是一种非常直观的数据展示控件。 1.1 核心特…...
MCP学习
一、MCP基础理论与核心概念 1.1 协议定义与设计目标 MCP(Model Context Protocol)是Anthropic公司于2024年11月开源的标准化协议,旨在解决大型语言模型(LLM)与外部工具、数据源之间的动态交互问题。其核心目标包括&…...
软件工程(三):模块的内聚模型
模块内聚的7种类型(从低到高) 等级类型描述示例1️⃣ 最低偶然性内聚(Coincidental Cohesion)模块内部的各功能毫无关系,随机拼凑一个模块中既有文件读写,又有图像压缩、还处理用户登录2️⃣逻辑性内聚&am…...
Java中字符转数字的原理解析 - 为什么char x - ‘0‘能得到对应数字
前言 在Java编程中,我们经常需要将字符形式的数字转换为实际的数值。有很多方法可以实现这一转换,比如使用Integer.parseInt()或Character.getNumericValue()等方法。但有一种简便且高效的方式是直接使用char - 0运算,本文将详细解析这种方法…...
View的事件分发机制
(一)为什么要有事件分发机制 安卓界面上面的View的层级结构是树形的,可能出现多个View重叠在一起的现象(如下图),当我们点击的地方为多个View重叠的区域时,这个点击事件应该给谁呢?为…...
【C++】类和对象【下】
目录 一、再探构造函数1、测试题 二、类型转换三、static成员1. 静态成员变量2. 静态成员函数 四、友元五、内部类六、匿名对象七、对象拷贝时的编译器优化 个人主页<—请点击 C专栏<—请点击 一、再探构造函数 之前我们实现构造函数时,初始化成员变量主要使…...
【JS逆向基础】并发爬虫
前言:所谓并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。强调多个事件在同一时间间隔发生。 1,进程、线程以及协程 【1】进程概念 我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算…...
Android组件化 -> 基础组件进行Application,Activity生命周期分发
在lib_common基础组件模块创建上下文持有类,生命周期派发类 object AppContextProvider {private lateinit var application: Applicationprivate var currentActivityRef: WeakReference<Activity>? null// 应用生命周期监听器列表private val appLifecyc…...
42. PCB防静电环设计
PCB防静电环的作用 1. PCB防静电环的作用2. 防静电环设计技术点 1. PCB防静电环的作用 防静电环主要用于生产、运输、售后等环节人体会直接接触电路板的场景。 防静电环只在顶层和底层设计即可。 2. 防静电环设计技术点...
深入理解Java反射机制
java反射是java语言中一个强大而灵活的特性,它允许程序在运行时检查和操作类、接口、字段和方法。 为了方便理解下文,我先给出Cat对象 public class Cat implements jump,Run {private int age;public String name;protected String color;double he…...
嵌入式音视频通话EasyRTC基于WebRTC技术驱动智能带屏音箱:开启智能交互新体验
一、引言 随着智能家居市场的蓬勃发展,智能带屏音箱作为家庭智能交互中心的重要组成部分,其功能需求日益丰富。EasyRTC凭借其低延迟、高稳定性的特点,为智能带屏音箱带来了全新的交互体验,能满足用户在视频通话、远程监控、在线…...
1987-2023年各省进出口总额数据整理(含进口和出口)(无缺失)
1987-2023年各省进出口总额数据整理(含进口和出口)(无缺失) 1、时间:1987-2023年 2、来源:各省年鉴、统计公报 3、指标:进出口总额(万美元)、进口总额(万美…...
paddle ocr 或 rapid ocr umi ocr 只识别了图片的下部分内容 解决方案
如上图,识别的准确率其实很高,但是只识别了下半部分的内容,上半部分的内容就没有识别到,其实是程序设置有点问题,程序设置的解决方案如下: 如上图,识别的准确率其实很高,但是只识别了下半部分的内容,上半部分的内容就没有识别到,其实是程序设置有点问题,程序设置的…...
【深度学习-Day 7】精通Pandas:从Series、DataFrame入门到数据清洗实战
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
如何测试 esp-webrtc-solution_solutions_doorbell_demo 例程?
软件准备 esp-webrtc-solution/solutions/doorbell_demo 例程 此例程集成了 WebSocket 传输视频流的应用 硬件准备 ESP32P4-Function-Ev-Board 环境搭建 推荐基于 esp-idf v5.4.1 版本的环境来编译此例程 若编译时出现依赖的组件报错,可进行如下修改ÿ…...
default和delete final和override
1.default和delete default 1.生成默认成员函数 2.仅适用于特殊成员函数(如构造函数、析构函数、拷贝/移动操作等) delete 1.删除函数 2.可应用于任何函数(不限于特殊成员函数) 2.final 和override final 用于类:…...
Nvidia Orin 安装onnxruntime-gpu
在用英伟达边缘设备Nvidia Orin 安装onnxruntime-gpu环境时, 通常会遇到很多问题。 在正常的Nvidia 服务器上安装onnxruntime-gpu 是非常简单的, 直接pip install onnxruntime-gpu即可, 但是在边缘设备上就没有这么简单了。 直接pip install…...
C++ CRTP技术(奇异递归模版模式)
C 的CRTP技术 最近了解到C的CRTP技术,通过博客来这里记录一下。 我们首先可以了解一下什么是CRTP技术。CRTP是C的一种高级模版变成模式。 他主要的用途有以下的几点: 编译时实现多态(静态多态):通过CRTP技术…...
验证es启动成功
1. 查看命令行输出信息 在启动 Elasticsearch 时,命令行窗口会输出一系列日志信息。若启动成功,日志里通常会有类似下面的信息: plaintext [2025-05-06T13:20:00,000][INFO ][o.e.n.Node ] [node_name] started其中 [node_na…...
AI工场全面激活电商创意链
在当今科技飞速发展的时代,北京先智先行科技有限公司凭借其卓越的创新能力,推出了“先知大模型”、“先行AI商学院”以及“先知AIGC超级工场”这三款旗舰产品,在市场上掀起了不小的波澜。 传统电商设计流程,从需求确认到营销策…...
数 学 函数
gcd int gcd(int a,int b){while(a%b){int ca%b;ab;bc;}return b; } 错位排列 typedef long long ll; ll d(int n){if(n1) return 0;if(n2) return 1;return (n-1)*(d(n-1)d(n-2)); } 快速幂 //注意看是否有mod的需求 int q_pow(int a,int b){int ans1,tempa;while(b){if(…...
springboot集成langchain4j记忆对话
流式输出 LLM 一次生成一个标记(token),因此许多 LLM 提供商提供了一种方式,可以逐个标记地流式传输响应,而不是等待整个文本生成完毕。 这显著改善了用户体验,因为用户不需要等待未知的时间,几…...
C语言初阶:数组
目录 0.数组要讲的知识点 1.一维数组的创建和初始化 1.1 数组的创建: 1.2数组实例: 1.3 数组的初识化: 例子: 2.一维数组的使用 例子: 总结: 3.一维数组在内存中的存储 4.二维数组的创建和初始化 4.…...
案例分享 | 攻克ADAS开发测试难题,实现单元动态测试新突破
汽车行业中的代码动态测试:守护智能汽车的安全与质量 在当今汽车行业,智能网联汽车的快速发展让软件成为了汽车的核心竞争力之一。从自动驾驶辅助系统到车载信息娱乐系统,汽车中的软件数量和复杂度都在不断增加。然而,软件的复杂…...
K8S 基于本地存储的持久卷
假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、背景分析 阅读本文,默认您有 PV-PVC、hostPath 相关知识。 由于安全方面的考虑,K8S 官方并不推荐 hostPath …...
LED实验
目录 1.LED介绍 1.1LED原理图: 2.单片机运行代码的流程 3.进制的转换 4.C51数据类型 5.小编的单片机型号:STC89C52RC/LE52RC,最高波特率:9600 6.点亮一个LED 代码 步骤 代码: 7.LED闪烁 在STC内操作&#x…...
python+pytest接口自动化测试--日志记录
前言:代码可以直接复制使用 解决问题: 问题1:日志重复记录的问题,比如运行一个模块日志会记录很多遍(通过handlers是否存在解决的) 问题2:运行测试用例进行多个模块相互调用.日志记录不全的问题(通过共享公共的handlers解决问题) 首先写一个日志记录的工具 # 这个是个日志的…...
Android 蓝牙开发调试总结
Android 蓝牙开发调试总结 文章目录 Android 蓝牙开发调试总结一、前言二、蓝牙开发1、开关和连接控制2、相关日志3、相关广播4、demo示例 三、其他1、Android 蓝牙开发调试小结2、Android14 蓝牙启动流程3、Android14 蓝牙 BluetoothService 启动和相关代码介绍4、Android13 蓝…...
混淆矩阵(Confusion Matrix)
混淆矩阵(Confusion Matrix)是一个用于评估分类模型性能的工具,特别是在机器学习和统计学领域。它展示了模型预测结果与实际结果之间的关系。混淆矩阵通常用于二分类或多分类问题中,但也可以扩展到更多类别的情况。 一、混淆矩阵…...
C语言——操作符
一.操作符的分类 算术操作符: - * / %移位操作符:<< >>位操作符: & | ^赋值操作符: - * / % > & | ^单⽬操作符: ! -- & * - ~ sizeof …...
大数据处理利器:Hadoop 入门指南
一、Hadoop 是什么?—— 分布式计算的基石 在大数据时代,处理海量数据需要强大的技术支撑,Hadoop 应运而生。Apache Hadoop 是一个开源的分布式计算框架,致力于为大规模数据集提供可靠、可扩展的分布式处理能力。其核心设计理念是…...
追踪大型语言模型的思想(上)(来自针对Claude的分析)
概述 像 Claude 这样的语言模型并非由人类直接编程,而是通过大量数据进行训练。在训练过程中,它们会学习解决问题的策略。这些策略被编码在模型为每个单词执行的数十亿次计算中。对于我们这些模型开发者来说,这些策略是难以捉摸的。这意…...
系统 Python 与 Conda 环境的灵活切换
在现代 Python 开发中,经常需要在系统 Python 和 Conda 环境中的 Python 之间切换。无论是处理不同项目的依赖冲突,还是测试代码在不同 Python 版本下的兼容性,灵活切换 Python 环境都是开发者的必备技能。本文将详细介绍如何实现 Python 环境的灵活切换,并提供 Conda 命令…...
【HTTP】《HTTP 全原理解析:从请求到响应的奇妙之旅》
文章目录 一、HTTP 协议1.1、HTTP 是什么1.2、理解 "应用层协议"1.3、理解 HTTP 协议的工作过程1.4、HTTP协议格式1.5、协议格式总结 二、HTTP 请求1.1、认识 URL1.1.1、URL 基本格式1.1.2、关于 URL encode 1.2、认识 "方法"1.2.1 、GET 方法1.2.2、 POST…...
重生之我在2024学Fine-tuning
一、Fine-tuning(微调)概述 Fine-tuning(微调)是机器学习和深度学习中的一个重要概念,特别是在预训练模型的应用上。它指的是在模型已经通过大量数据训练得到一个通用的预训练模型后,再针对特定的任务或数据…...
若依前后端分离项目中可以删除哪些原若依有的?
在若依(RuoYi)前后端分离项目中完成二次开发后,可以删除以下未使用的模块和文件以简化项目结构。以下分模块和风险点说明: --- ### **一、后端(Spring Boot)可删除内容** #### 1. **未使用的功能模块** …...
element-plus中,vue3项目,el-input密码框禁止浏览器自动弹出浏览器历史密码提示框
原代码(密码框是text框): <el-form-item label"用户名" :label-width"formLabelWidth" v-if"!localOrhuawei" prop"userName"><el-input v-model"formDialog.userName" />&l…...
二叉树的遍历与构造
唉,好想回家,我想回家跟馒头酱玩,想老爸老妈。如果上天再给我一次选择的机会,我会选择当一只小动物,或者当棵大树也好,或者我希望自己不要有那么多多余的情绪,不要太被别人影响,开心…...
「Mac畅玩AIGC与多模态23」开发篇19 - Markdown 富文本输出工作流示例
一、概述 本篇基于格式化文本整合的经验,进一步介绍如何通过 LLM 输出标准 Markdown 内容,并在前端正确渲染出标题、列表、加粗等富文本格式,提升展示效果与内容结构可读性。 二、环境准备 macOS 系统Dify 平台已部署并可访问 三、在 Dif…...
记录学习《手动学习深度学习》这本书的笔记(十)
因为最近在做《语音与语言理解综合处理》的实验,所以打算先看第14章:自然语言处理:预训练和第15章:自然语言处理:应用,之后再来看第13章:计算机视觉。 第十四章:自然语言处理&#…...
Flowable7.x学习笔记(二十一)查看我的发起
前言 “查看我的发起”功能,就是将当前用户作为流程发起人启动的所有流程实例集中展示,帮助用户随时跟踪自己提交的业务请求的状态与历史,提升透明度与可控性。 业务人员通常不知道流程引擎底层如何运转,只关心“我提交的报销/申请…...
【Bootstrap V4系列】学习入门教程之 组件-折叠(Collapse)
Bootstrap V4系列 学习入门教程之 组件-折叠(Collapse) 折叠(Collapse)How it works一、Example二、Horizontal 水平的三、Multiple targets 多个目标四、Accordion example 手风琴示例 折叠(Collapse) 通…...
ROS1和ROS2使用桥接工具通信
前提:主从机在同一局域网内,可以互相ping通 我的两个设备其中一个无法连接wifi,ubuntu老生常谈的问题.....,获得新的技能:手机蓝牙提供网络,两个设备连接手机蓝牙就可以连接网络并且处于同一个局域网内。 我的主机为…...
尤雨溪宣布:Vue 生态正式引入 AI
在前端开发领域,Vue 框架一直以其易用性和灵活性受到广大开发者的喜爱。 而如今,Vue 生态在人工智能(AI)领域的应用上又迈出了重要的一步。 尤雨溪近日宣布,Vue、Vite 和 Rolldown 的文档网站均已添加了llms.txt文件,这一举措旨在让大型语言模型(LLM)更方便地理解这些…...
分布式id的两大门派!时钟回拨问题的解决方案!
2.1 两大门派 目前业界的分布式ID实现路径归结起来有两派:一派以雪花算法为代表,不强依赖DB能力,只使用分布式节点自身信息(时间戳节点ID序列号)的编码生成唯一序列,好处是去中心化、无单点风险࿱…...
QMK键盘固件配置详解
QMK键盘固件配置详解 前言 大家好!今天给大家带来QMK键盘固件配置的详细指南。如果你正在DIY机械键盘或者想要给自己的键盘刷固件,这篇文章绝对不容错过。QMK是目前最流行的开源键盘固件框架之一,它允许我们对键盘进行高度自定义。接下来&a…...