MySQL的日志--Undo Log【学习笔记】
MySQL的日志--Undo Log
知识来源:
- 《MySQL是怎样运行的》--- 小孩子4919
为了保证事务的原子性,当事务中途遇到各种错误需要将数据回滚(rollback)到原来的样子。为此MySQL提出撤销日志(Undo Log,也称undo日志)。
事务id
-
InnoDB的每条行记录都有一个隐藏列trx_id,这个便是记录修改当前记录的事务的id。
-
事务的id存储在系统表空间页号为5的页中一个名为Max Trx ID的属性中
-
每次MySQL启动时会将这个值读到内存中,并且加256
-
每次分配给事务后,自增1
-
等到这个值为256的倍数时,就会将这个值持久化到Max Trx ID
-
-
事务id只有在事务中有语句对用户表、临时表进行增删改操作后才会被分配给事务,否则该事务的id为0。
-
start transaction read only,开启一个只读事务,对临时表增删改后才会被分配事务id。
-
start transaction [read write],开启一个读写事务,对用户表、临时表增删改后才会被分配事务id。
-
undo日志的格式
-
每条undo日志都会有一个undo no,在一个事务中从0开始递增,每个事务都会在内部维护一个undo no
-
Undo Log会存在于FIL_PAGE_UNDO_LOG类型(0x0002)的页中,这些页存在于系统表空间或者undo表空间(undo tablespace)。
-
undo日志被分为两个大类TRX_UNDO_INSERT(插入类型)和TRX_UNDO_UPDATE(修改类型)
-
大类下面分为需要小类,用undo type的字段表示。
-
-
聚簇索引(一棵b+树)中的叶子节点存放着一条条记录, 每条记录都有一个隐藏字段roll_pointer,指向undo日志的起始地址,roll_pointer的结构如下:
-
-
-
is_insert:是否为TRX_UNDO_INSERT大类的undo日志
-
resg id:undo日志所在回滚段的编号。回滚段编号为0~127。
-
page number:undo日志所在的页号。
-
offset:undo日志在页面中的偏移量。
-
TRX_UNDO_INSERT大类的undo日志
INSERT操作对应的undo日志
-
undo type为TRX_UNDO_INSERT_REC
-
会记录主键各字段的长度(len)和值(value),用于未来在聚簇索引中删除这条插入的记录,还可以根据主键删除对应的二级索引记录
TRX_UNDO_UPDATE大类的undo日志
-
这个大类的undo日志中都会包含trx_id和roll_pointer,用于形成版本链
-
每次对一条记录生成undo日志时,就会将该记录的trx_id和roll_pointer,赋值给这条新的undo日志。
-
DELETE操作对应的undo日志
在介绍删除操作的undo日志之前,首先得说明一下记录的删除各阶段。
delete mark阶段:将记录的delete_flag设置为1,意味逻辑删除。记录还是在原来位置没有动。
purge阶段:等待删除语句所在的事务提交后,就会有专门的后台线程将该记录转移到垃圾链表(PAGE_FREE链表)的头部。并且将页面的其他管理信息修改,如:PAGE_LAST_INSERT、PAGE_GARBAGE会加上移入垃圾链表的记录的大小。
等到后续插入的时候,会优先判断FREE_PAGE的头节点空间是否足够,可以的话就直接重用被删除记录的空间,当然可能会产生碎片(新纪录小于被删除记录)。如果不行,就从页面最后一条记录后面开辟出一块空间。
如果连后面的空间都没有,则会统计剩余空间和碎片总体空间大小,如果这两者大于新插入的记录,则会重整页面(开辟一个新页面,将原来页面的记录顺序复制),插入新纪录。
-
undo type为TRX_UNDO_DEL_MARK_REC
-
相较于TRX_UNDO_INSERT大类的undo日志,除了主键各字段的信息,还存储着各个索引列各字段的信息,该列在记录中的位置(pos)、长度(len)和值(value)
-
这些信息主要用于purge阶段真正删除记录。TODO
-
UPDATE操作对应的undo日志
更新语句产生的undo日志被分为四种情况。
-
不更新索引列
-
原地更新(in-place update)
-
当更新前后每个列占用空间大小没有变化,则会进行就地更新。仅生成一条undo日志。
-
-
删除旧纪录、插入新纪录
-
不满足就地更新的条件时,用户线程(不是后台线程)会将原来的记录删除(直接扔进PAGE_FREE链表)。
-
在插入新纪录后,就会生成一条TRX_UNDO_UPD_EXIST_REC类型的undo日志。
-
-
相较于TRX_UNDO_DEL_MARK_REC类型的undo日志最大的区别,就是多了被更新列的信息,列在记录中的位置(pos)、长度(old_len)和值(old_value)
-
-
-
-
更新主键列
-
逻辑删除原纪录(delete mark操作)。事务提交后,才会真正删除。此时会生成一条TRX_UNDO_DEL_MARK_REC类型的undo日志
-
根据更新各个字段,形成一条新纪录插入,然后生成一条TRX_UNDO_INSERT_REC类型的undo日志
-
TODO,如何回滚
-
-
-
更新二级索引列
-
和更新主键类似
-
唯一不同的点,就是更新主键列,会将事务id赋值给那条新插入的记录的trx_id。
-
而二级索引插入的新纪录没有这个隐藏列,所以就把事务的id赋值给页面中Page Header中的PAGE_MAX_TRX_ID字段,表示该页面中修改记录的最大事务id。
-
-
FIL_PAGE_UNDO_LOG类型页的结构
这种类型的页面简称undo页。undo页面会通过链表结构互相串起来,而链表的头节点存放在第一个undo页,被称为first undo page,其余的页均被称为normal undo page。first undo page比normal undo page多了两部分信息。
每个事务根据undo日志类型的不同(插入、更新)、操作表的类型不同(用户表、系统表),而分配到四种不同类型undo页的链表。
first undo page
-
File Header和File Trailer是innodb页的基本结构,每种类型的页面都有这两个结构。
-
Undo Page Header
-
TRX_UNDO_PAGE_TYPE:表示该undo页存储的undo日志大类
-
前面提到过undo日志被分为TRX_UNDO_INSERT和TRX_UNDO_UPDATE两个大类。存放TRX_UNDO_INSERT类型undo记录的undo页不能存储TRX_UNDO_UPDATE类型的undo记录。
-
因为TRX_UNDO_UPDATE类型的undo记录在事务提交后,还需要为MVCC服务。而TRX_UNDO_INSERT类型的undo日志在事务提交后,就可以被回收了。
-
-
TRX_UNDO_PAGE_START:表示页面第一条undo日志开始时的偏移量。
-
TRX_UNDO_PAGE_FREE:表示页面中最后一条undo日志结束时的偏移量。
-
-
TRX_UNDO_PAGE_NODE:表示双向链表结构节点。
-
-
-
Undo Log Segment Header:每个undo页链表对应着一个undo日志段。在事务刚开始生成undo日志之前,会先分配一个undo日志段,从这个段中分配到的第一个页面就是first undo page,而Undo Log Segment Header就存储这个段的一些信息。
-
-
TRX_UNDO_STATE:本undo页面链表的状态。
-
TRX_UNDO_ACTIVE:一个活跃的事务正在向这个undo页链表中写入undo日志
-
TRX_UNDO_CACHED:处于该状态的undo页链表等待之后被其他事务重用
-
TRX_UNDO_FREE:对于insert undo链表来说,如果在它对应的事务提交之后,该链表不能被重用,那么就会处于这种状态
-
TRX_UNDO_PURGE:对于update undo链表来说,如果在它对应的事务提交之后,该链表不能被重用,那么就会处于这种状态
-
TRX_UNDO_PREPARED:处于此状态的undo页链表用于存储处于PREPARED阶段的事务产生的日志。
-
-
TRX_UNDO_LAST_LOG:本undo页面链表中最后一个Undo Log Header的位置。
-
TRX_UNDO_FSEG_HEADER:这个就是指向那个段的指针
-
TRX_UNDO_PAGE_LIST:表示undo页链表的头节点
-
-
-
Undo Log Header
-
-
TRX_UNDO_TRX_ID:生成本组undo日志的事务id
-
TRX_UNDO_TRX_NO:事务提交后生成的一个序号,先提交的序号小,后提交的序号大
-
TRX_UNDO_NEXT_LOG:下一组undo日志在页面中开始的偏移量
-
TRX_UNDO_PREV_LOG:上一组undo日志在页面中开始的偏移量
-
一个事务在undo链表中插入的undo日志算一组,按理说应该只有一组,因为undo链表同一时间只能被一个事务占有。但是undo链表可以被重用,如果被重用的话,那么就会有多组undo日志存在于一个undo页链表了。
-
-
-
undo日志
-
每条undo日志都是紧密相连,十分紧凑。
-
normal undo page
-
相较于first undo page,少了两大块信息
回滚段
每个事务在执行过程中,至多被分配四个类型的undo页链表。这些undo链表的first undo page的页号则被存放在回滚段中的第一个页面的TRX_RSEG_UNDO_SLOTS中,当然整个回滚段中就只有这么一个页面,叫做Rollback Segment Header。
-
TRX_RSEG_MAX_SIZE:这个回滚段中管理的所有undo页链表中的undo页数量之和的最大值,默认值为0xFFFFFFFE
-
TRX_RSEG_HISTORY_SIZE:History链表占用的页面数量。
-
TRX_RSEG_HISTORY:History链表的头节点。
-
TRX_RSEG_FSEG_HEADER:指向回滚段。
-
TRX_RSEG_UNDO_SLOTS:每个undo页链表的first undo page的页号,每一个页号都叫做一个undo slot,一共有1024个。如果该undo slot没有指向undo页,则值为FIL_NULL(0xFFFFFFFF)
重用undo链表
-
需要满足
-
链表中只有一个undo页
-
该undo页使用空间小于整个页面空间的3/4
-
-
根据undo链表类型的不同而放入不同的cache链表,并且first undo page的Undo Log Segment Header的TRX_UNDO_STATE被设置为TRX_UNDO_CACHED
-
insert undo链表:undo slot被放入insert into cached链表
-
update undo链表:undo slot被放入update into cached链表
-
-
如果可以被重用,那么新事务则会重用undo页链表
-
insert undo链表:直接从头开始覆盖
-
-
update undo链表:从末尾追加。
-
-
-
如果不能被重用
-
insert undo链表:first undo page的Undo Log Segment Header的TRX_UNDO_STATE被设置为TRX_UNDO_FREE。之后Undo Log Segment会被释放掉,然后undo slot置为FIL_NULL
-
update undo链表:first undo page的Undo Log Segment Header的TRX_UNDO_STATE被设置为TRX_UNDO_PURGE。然后undo slot置为FIL_NULL。Undo Log Segment用于MVCC,当最后一个引用该段的事务也提交了,这个段才会被释放掉。
-
从回滚段中申请undo页面的流程如下:
-
首先查看两个cached链表中是否有可重用的undo slot,如果有则直接分配
-
没有的话,就从头开始遍历undo slot,如果值为FIL_NULL,则新分配一个段,创建first undo page,将该页号赋值给undo slot
-
否则,查找下一个undo slot,全部undo slot都被分配了,就会报错"Too many active concurrent transactions"
系统表空间页号为5的页面
如果说系统中只有一个回滚段,那么最多分配出1024个undo页的链表,假设一个事务分配一个undo页链表,那也就支持1024个事务的并发,那颗太少了。所以系统表空间中存在一个页号为5的页面,里面存放着128个回滚段的地址,也就是说系统可以最多分配1024*128个undo页链表,那很够了。
-
表空间id+页号,指向一个回滚段。
-
回滚段编号分为0~127
-
0号回滚段必须存在于系统表空间中
-
1~32号回滚段必须存在于临时表空间中(数据目录中的ibtmp1文件)
-
33~127号回滚段默认存在于系统表空间中,也可以自己配置的undo表空间(undo tablespace)
-
-
为什么要将回滚段分成两大类呢?
-
因为修改页面会记录redo日志保证持久化,那么保证undo页的持久化也需要redo日志。记录redo日志就需要消耗性能,对于临时表来说,系统崩溃后恢复根本不需要恢复,因为本来表就是临时的,那么针对这个回滚段的undo页就不会生成对应的redo日志。
-
-
现在讲讲事务分配undo页链表的全过程。
-
首先遍历第五号页面的128个回滚段指针,如果是针对临时表的事务就分配1~32号回滚段,否则分配0或33~127号回滚段。每个回滚段只能分配给一个事务,当前事务分配了0号回滚段,那下一个事务就只能分配到33号回滚段。
-
通过回滚段指针,找到对应的回滚段,首先查找对应的cached链表是否有可重用的undo slot,如果有,则直接重用对应的Undo Log Segment(当然undo页的类型需要对上,TRX_UNDO_UPDATE类型的undo链表只能被分配给需要TRX_UNDO_UPDATE类型undo链表的事务)
-
如果cached链表为空,此时就需要遍历undo slot,找到值为FIL_NULL的undo slot,并且申请一个Undo Log Segment,并申请first undo page,之后将该页的页号填写到undo slot中
-
之后就可以写入undo日志了。
-
回滚段的相关配置
-
innodb_rollback_segments:回滚段的数量
-
设置为1,那么系统会分配0~32号回滚段,1~32号回滚段针对临时表
-
设置为1~33,系统依然分配0~32号回滚段,1~32号回滚段针对临时表
-
设置为33~128,系统会分配对应设置数目的回滚段,1~32号回滚段针对临时表,其余针对普通表
-
-
innodb_undo_directory:设置undo表空间所在的目录,默认为数据目录
-
innodb_undo_tablespaces:undo表空间的数量,33~127号回滚段会平均分配到不同undo表空间中。
-
undo表空间体积过大,会自动阶段成小文件,而系统表空间只能不断增大,直到文件系统出错。
-
系统初始化配置了undo表空间,那么0号回滚段就不可用。
-
系统恢复回滚未完成的事务
-
首先加载系统表空间页号为5的页面
-
查看0和33~127号回滚段,遍历每个值不为FIL_NULL的undo slot
-
找到对应的undo页链表的first undo page,筛选出Undo Segment Header中TRX_UNDO_STATE为TRX_UNDO_ACTIVE类型的,表示该undo链表生前在内存中,正在被一个事务写入undo日志。
-
通过Undo Segment Header找到TRX_UNDO_LAST_LOG属性,找到链表中最后一个Undo Log Header的位置,通过undo日志将该事务对页面所做的更改全部回滚掉。
相关文章:
MySQL的日志--Undo Log【学习笔记】
MySQL的日志--Undo Log 知识来源: 《MySQL是怎样运行的》--- 小孩子4919 为了保证事务的原子性,当事务中途遇到各种错误需要将数据回滚(rollback)到原来的样子。为此MySQL提出撤销日志(Undo Log,也称undo日…...
一洽 全力辅助商户平台在线咨询解决方案
在商业数字化转型加速的背景下,客户对高效服务的需求日益增强。商户平台需要通过优化在线咨询服务,提升客户沟通效率与服务质量。一套综合性的在线咨询解决方案,通过整合多维度功能与智能技术,能够有效满足商户与客户的双向需求&a…...
ctfshow-web-新春欢乐杯
这几天做了这个新春欢乐杯,对于我这个小萌新来说有难度,同时也是收获满满,以下是我解题流程和收获 热身 <?php/* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2022-01-16 15:42:02 # Last Modified by: h1xa # Last Modified …...
信奥赛之c++基础(初识循环嵌套与ASCII密码本)
🎠 游乐园编程奇遇记——循环嵌套与ASCII密码本 🎡 第一章:摩天轮与旋转木马——循环嵌套 🎪 游乐场里的双重循环 for(int 排数=1; 排数<=3; 排数++){// 外层循环像摩天轮for(int 座位=1; 座位<=5; 座位++){// 内层循环像旋转木马cout << "🎪"…...
同一电脑下使用 python2 和 python3
我本地先安装的2,然后再安装3。在电脑的环境变量 - Path 内,发现3的路径没有被加上,所以在cmd内输入python调用的是python2目录下的python.exe文件。pip.exe则是在Python/Scripts目录下,也就是默认调用的pip也是2的。 解决方案&…...
第十二届蓝桥杯 2021 C/C++组 直线
目录 题目: 题目描述: 题目链接: 思路: 核心思路: 两点确定一条直线: 思路详解: 代码: 第一种方式代码详解: 第二种方式代码详解: 题目:…...
向量数据库实践:存储和检索向量数据
向量数据库是一种专门设计用于存储和检索向量嵌入的数据库系统,能够支持语义搜索、推荐系统、图像识别等 AI 应用场景。 下面将详细介绍向量数据库中向量数据的存储和检索原理及实际应用,希望对各位读者有所帮助。 一. 向量数据的存储与检索流程 在向量…...
Pandas 数据导出:如何将 DataFrame 追加到 Excel 的不同工作表
在数据分析和数据处理过程中,将数据导出到 Excel 文件是一个常见的需求。Pandas 提供了强大的功能来实现这一需求,尤其是将数据追加到同一个 Excel 文件的不同工作表(Sheet)中。本文将详细介绍如何使用 Pandas 实现这一功能&#…...
区块链驱动的供应链金融创新:模型构建与商业化路径研究
区块链驱动的供应链金融创新:模型构建与商业化路径研究 1. 研究背景与意义 1.1 背景介绍 全球供应链金融市场规模预计2025年将达到3.6万亿美元,但传统模式面临四大核心问题:信息孤岛导致信任成本高昂(占交易成本15-20%…...
DAX Studio将PowerBI与EXCEL连接
DAX Studio将PowerBI与EXCEL连接 具体步骤如下: 第一步:先打开一个PowerBI的文件,在外部工具栏里打开DAXStudio,如图: 第二步:DAXStudio界面,点击Advanced选项卡-->Analyze in Excel&#…...
使用springboot+easyexcel实现导出excel并合并指定单元格
1:准备一个单元格合并策略类代码: import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metadata.holder.Writ…...
conformer编码器
abstract 最近,基于Transformer和卷积神经网络(CNN)的模型在自动语音识别(ASR)中显示出有希望的结果,优于递归神经网络(RNN)。Transformer模型擅长捕捉基于内容的全局交互,而CNN则有效地利用了局部特征。在这项工作中,我们通过研究如何将联合收割机卷积神经网络和tr…...
每日c/c++题 备战蓝桥杯(P1252洛谷 马拉松接力赛)
洛谷P1060 马拉松接力赛题解:贪心算法在资源分配中的巧妙应用 题目描述 P1060 马拉松接力赛是一道结合贪心策略与动态规划思想的资源分配问题。题目要求将25公里的马拉松接力赛合理分配给5名选手,使得总耗时最短。每位选手可跑1-10公里的整数距离&…...
操作指南:vLLM 部署开源大语言模型(LLM)
vLLM 是一个专为高效部署大语言模型(LLM)设计的开源推理框架,其核心优势在于显存优化、高吞吐量及云原生支持。 vLLM 部署开源大模型的详细步骤及优化策略: 一、环境准备与安装 安装 vLLM 基础安装:通过 pip 直接安装…...
目前市面上知名的数据采集器
程序员爱自己动手打造一切,但这样离钱就会比较远。 市面上知名的数据采集工具 数据采集工具(也称为网络爬虫或数据抓取工具)在市场上有很多选择,以下是目前比较知名和广泛使用的工具分类介绍: 一、开源免费工具 Scra…...
BitNet: 微软开源的 1-bit 大模型推理框架
GitHub:https://github.com/microsoft/BitNet 更多AI开源软件:发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI 微软专为 CPU 本地推理和极致压缩(低比特)大模型设计的推理框架。它支持对 1-bit/1.58-bit 量化模型进行…...
前端如何获取文件的 Hash 值?多种方式详解、对比与实践指南
文章目录 前言一、Hash 值为何重要?二、Hash 值基础知识2.1 什么是 Hash?2.2 Hash 在前端的应用场景2.3 常见的 Hash 算法(MD5、SHA 系列) 三、前端获取文件 Hash 的常用方式3.1 使用 SparkMD5 计算 MD5 值3.2 使用 Web Crypto AP…...
Java与Kotlin在Android开发中的全面对比分析
趋势很重要 语言发展背景与现状 Android操作系统自2008年正式发布以来,Java长期作为其主要的开发语言。这种选择源于Java语言的跨平台特性、成熟的生态系统以及广泛开发者基础。然而,随着移动开发需求的快速演变,Java在Android开发中逐渐暴…...
Android Kotlin 依赖注入全解:Koin appModule 配置与多 ViewModel 数据共享实战指南
一、基础配置与概念 1. 什么是 appModule appModule 是 Koin 依赖注入框架中的核心配置模块,用于集中管理应用中的所有依赖项。它本质上是一个 Koin 模块(org.koin.core.module.Module),通过 DSL 方式声明各种组件的创建方式和依…...
Flink TaskManager详解
1. TaskManager 概述 Apache Flink 的 TaskManager 是作业执行的核心工作节点,负责实际的数据处理任务。它与 JobManager 协同工作,接受其调度指令,管理本地资源(如 CPU、内存、网络),并执行具体的算子&am…...
Docker安装(Ubuntu22版)
前言 你是否还在为Linux上配置Docker而感到烦恼? 你是否还在为docker search,docker pull连接不上,而感到沮丧? 本文将解决以上你的所有烦恼!快速安装好docker! Docker安装 首先,我们得先卸载…...
《深入浅出ProtoBuf:从环境搭建到高效数据序列化》
ProtoBuf详解 1、初识ProtoBuf2、安装ProtoBuf2.1、ProtoBuf在Windows下的安装2.2、ProtoBuf在Linux下的安装 3、快速上手——通讯录V1.03.1、步骤1:创建.proto文件3.2、步骤2:编译contacts.proto文件,生成C文件3.3、步骤3:序列化…...
【含文档+PPT+源码】基于微信小程序连锁药店商城
项目介绍 本课程演示的是一款基于微信小程序连锁药店商城,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带的…...
再见,物理删除!MyBatis-Plus @TableLogic 优雅实现逻辑删除
在开发应用程序时,我们经常会遇到需要删除数据的场景。但直接从数据库中物理删除(DELETE)数据有时并非最佳选择。为什么呢? 数据恢复: 一旦物理删除,数据通常难以恢复,误操作可能导致灾难性后果。审计追…...
uni-app中获取用户实时位置完整指南:解决权限报错问题
uni-app中获取用户实时位置完整指南:解决权限报错问题 在uni-app开发运行在微信小程序时,获取用户位置信息是一个常见的需求,无论是用于地图导航、附近推荐还是其他基于位置的服务。然而,许多开发者在调用位置相关API时会遇到各种…...
【AI插件开发】Notepad++ AI插件开发1.0发布和使用说明
一、产品简介 AiCoder是一款为Notepad设计的轻量级AI辅助插件,提供以下核心功能: 嵌入式提问:对选中的文本内容进行AI分析,通过侧边栏聊天界面与AI交互,实现多轮对话、问题解答或代码生成。对话式提问:独…...
UnityEditor - 调用编辑器菜单功能
例如: 调用Edit/Frame Selected In Scene EditorApplication.ExecuteMenuItem("Edit/Frame Selected in Scene"); EditorApplication.ExecuteMenuItem("Edit/Lock view to Selected");...
OpenHarmony - 小型系统内核(LiteOS-A)(十),魔法键使用方法,用户态异常信息说明
OpenHarmony - 小型系统内核(LiteOS-A)(十) 十四、魔法键使用方法 使用场景 在系统运行出现无响应等情况时,可以通过魔法键功能确定系统是否被锁中断(魔法键也无响应)或者查看系统任务运行状态…...
在 Vue3 中封装的 Axios 实例中,若需要为部分接口提供手动取消请求的功能
核心思路 封装接口时返回 Promise 和 abort 方法: 为需要支持取消的接口返回一个对象,包含 promise 和 abort 方法,用户可通过 abort 主动中断请求。使用 AbortController 或 CancelToken: 推荐 AbortController(浏览…...
QuecPython+audio:实现音频的录制与播放
概述 QuecPython 作为专为物联网设计的开发框架,通过高度封装的 Python 接口为嵌入式设备提供了完整的音频处理能力。本文主要介绍如何利用 QuecPython 快速实现音频功能的开发。 核心优势 极简开发:3行代码完成基础音频录制与播放。快速上手…...
Langchain入门介绍
[声明] 本文参考:Langchain官方文档 什么是LangChain? LangChain 是一个开源的、用于开发由大型语言模型 (LLM) 驱动的应用程序的框架。它的核心目标是将强大的 LLM(如 GPT-4, Claude, Llama 等)与外部数据源、计算资源和工具连接起来,从…...
WebUI可视化:第4章:Streamlit数据可视化实战
学习目标 ✅ 掌握Streamlit的安装与基础配置 ✅ 能够创建数据驱动的交互式界面 ✅ 实现常见图表(折线图、柱状图等)的绘制 ✅ 开发完整的业务数据分析应用 4.1 Streamlit快速入门 4.1.1 环境安装 打开终端执行: bash pip install streamlit 验证安装: bash stream…...
3.4 Spring Boot异常处理
本实战项目通过Spring Boot实现了一个简单的用户信息查询功能,并展示了如何自定义异常处理机制。项目中创建了用户实体类User和用户控制器UserController,在控制器中通过isValidUserId方法校验用户ID是否有效,若无效则抛出自定义异常InvalidU…...
期货有哪些种类?什么是股指、利率和外汇期货?
期货主要可以分成两大类:商品期货和金融期货。商品期货,顾名思义,就是跟实物商品有关的期货,比如农产品、金属、能源这些。金融期货呢,就是跟金融产品有关的期货,比如外汇、利率、股票指数这些。 一、商品…...
Golang | 位运算
位运算比常规运算快,常用于搜索引擎的筛选功能。例如,数字除以二等价于向右移位,位移运算比除法快。...
[论文阅读]ReAct: Synergizing Reasoning and Acting in Language Models
ReAct: Synergizing Reasoning and Acting in Language Models [2210.03629] ReAct: Synergizing Reasoning and Acting in Language Models ICLR 2023 这是一篇在2022年挂出来的论文,不要以现在更加强大且性能综合的LLM来对这篇文章进行批判。 思想来源于作者对…...
拥有600+门店的宠物连锁医院,实现核心业务系统上云
瑞派宠物医院管理股份有限公司(以下简称“瑞派宠物“)从2017年开始数字化转型之路。瑞派宠物在全国有600连锁门店,随着业务量增加,线下部署的财务系统存在设备老旧、机房环境差等问题,部分在公有云上的业务,…...
OceanBase 跻身 Forrester 三大领域代表厂商,全面支撑AI场景
在生成式AI迅猛发展的当下,智能化数据管理已成为企业提升数字化水平、优化运营效率和强化市场竞争优势的战略重点。Forrester 最新发布的《2025年中国数据管理生态系统趋势报告》中,OceanBase凭借原生分布式架构和一体化产品优势,入选 全局数…...
学生管理系统微服务方式实现
//不用这种方式实现也可以,用这种方式是为了房间我们理解微服务的实现方式 微服务的实现方式就是把一个单项目应用的不同功能封装成单独的项目,然后向外暴露一个接口以便调用。如果需要这个功能我们直接调用这个功能对应项目的接口就可以了 服务之间的…...
OpenAI最新的4o图像生成模型 gpt-image-1 深度解析:API KEY 获取、开发代码示例
1. 引言 近期,OpenAI 正式发布了其最新的图像生成 API,模型标识符为 gpt-image-1。这一重要发布,首次将先前在 ChatGPT 中通过 GPT-4o 模型驱动、备受用户欢迎的先进图像生成能力,以编程接口(API)的形式提…...
NAT穿透
NAT是 Net Address Traslation的缩写,即网络地址转换 NAT部署在网络出口的位置。位于内网和公网之间,是连接内挖个主机和公网的桥梁,双向流量都必须经过NAT,装有NAT软件的路由器叫NAT路由器,NAT路由器拥有公网Ip NAT解…...
人工智能与机器学习:Python从零实现性回归模型
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
FreeRTOS
FreeRTOS任务调度的三种方式: 抢占式调度 针对优先级不同的任务 时间片调度 针对优先级相同的任务; FreeRTOS中的一个时间片就等于SysTick(滴答定时器)中断周期(1ms); 协程式调度 后续将不再支持。 …...
PCI 总线学习笔记(五)
PCI 总线学习系列,参考自 技术大牛博客: PCIe 扫盲系列博文连载目录篇 书籍:王齐老师的《PCI Express 体系结构导读》 下面的文章中加入了自己的一些理解和实际使用中遇到的一些场景,供日后查询和回忆使用 PCI 总线定义了两类配置…...
PyTorch与CUDA的关系
文章目录 前言一、如何查看PyTorch和torchvision的版本1.1 查看PyTorch版本1.2 查看torchvision版本二、如何确认PyTorch和torchvision是否支持CUDA加速2.1 检查PyTorch是否支持CUDA2.2 查看当前可用的GPU设备2.3 检查torchvision是否支持CUDA三、CUDA版本的秘密:为什么PyTorc…...
网络中断事件进行根因分析(RCA)
网络中断事件的根因分析(RCA)详解 根因分析(Root Cause Analysis, RCA)是网络运维中用于定位和解决故障的核心方法,目标是找到问题的根本原因,避免重复发生。以下是完整的RCA流程和方法: 1. RC…...
Mac中 “XX”文件已损坏,无法打开 解决方案
前言 Mac中打开软件 出现“XX”文件已损坏,无法打开的提示 怎么处理? 操作总结 1、查看当前 Gatekeeper 是否启用 spctl --status2、完全关闭 Gatekeeper(允许安装任何来源应用) sudo spctl --master-disable3、打开“系统设…...
如何通过python连接hive,并对里面的表进行增删改查操作
要通过Python连接Hive并对其中的表进行增删改查操作,可以使用pyhive库。下面是一个简单的示例代码,演示如何连接Hive并执行一些操作: from pyhive import hive# 建立连接 conn hive.connect(hostyour_hive_host, port10000, authNOSASL)# 创…...
对Mac文字双击或三击鼠标左键没有任何反应
目录 项目场景: 问题描述 原因分析: 解决方案: 项目场景: 在使用Mac系统的时候,使用Apple无线鼠标,双击左键能够选取某个单词或词语,三击左键能够选取某一行,(百度、…...
【维护窗口内最值+单调队列/优先队列】Leetcode 239. 滑动窗口最大值
题目要求 给定一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。滑动窗口每次只向右移动一位。要求返回滑动窗口中的最大值。 示例 1 输入:nums [1,3,-1,-3,5,3,6,7], k 3 输出:[3,3,5,5,6,7] 解释&#…...