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

分布式事务Seata学习笔记

目录

1.Seata 是什么

 2. Seata快速开始

2.1 Seata Server(TC)环境搭建

db存储模式+Nacos(注册&配置中心)部署  

3. Seata Client快速开始 

4.demo源码:springcloudAlibaba: Alibaba微服务学习demo 


1.Seata 是什么

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和  XA 事务模式,为用户打造一站式的分布式解决方案。AT模式是阿里首推的模式,阿里云上有商用版本的GTS(Global Transaction  Service 全局事务服务)
官网:https://seata.io/zh-cn/index.html
源码: https://github.com/seata/seata
官方Demohttps://github.com/seata/seata-samples
1.1 Seata的三大角色
在 Seata 的架构中,一共有三个角色:
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
其中,TC 为单独部署的 Server 服务端,TM 和 RM 为嵌入到应用中的 Client 客户端。
在 Seata 中,一个分布式事务的生命周期如下:
1.TM 请求 TC 开启一个全局事务。TC 会生成一个 XID 作为该全局事务的编号。XID,会在微服务的调用链路中传播,保证将多个微服务
的子事务关联在一起。
当一进入事务方法中就会生成XID , global_table 就是存储的全局事务信息 ,
2.RM 请求 TC 将本地事务注册为全局事务的分支事务,通过全局事务的 XID 进行关联。
当运行数据库操作方法,branch_table 存储事务参与者
3.TM 请求 TC 告诉 XID 对应的全局事务是进行提交还是回滚。
4.TC 驱动 RM 们将 XID 对应的自己的本地事务进行提交还是回滚。
1.2 设计思路
AT模式的核心是对业务无侵入,是一种改进后的两阶段提交,其设计思路如图
第一阶段
业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。核心在于对业务sql进行解析,转换成undolog,并同时 入库,这是怎么做的呢?先抛出一个概念DataSourceProxy代理数据源,通过名字大家大概也能基本猜到是什么个操作,后面做具体分析
参考官方文档: https://seata.io/zh-cn/docs/dev/mode/at-mode.html

 

第二阶段
分布式事务操作成功,则TC通知RM异步删除undolog

分布式事务操作失败,TM向TC发送回滚请求,RM 收到协调器TC发来的回滚请求,通过 XID 和 Branch ID 找到相应的回滚日志记录,通过回滚记录生成反向的更新 SQL 并执行,以完成分支的回滚。

整体执行流程

1.3 设计亮点
相比与其它分布式事务框架,Seata架构的亮点主要有几个:
1. 应用层基于SQL解析实现了自动补偿,从而最大程度的降低业务侵入性;
2. 将分布式事务中TC(事务协调者)独立部署,负责事务的注册、回滚;
3. 通过全局锁实现了写隔离与读隔离。
1.4 存在的问题
  • 性能损耗
一条Update的SQL,则需要全局事务xid获取(与TC通讯)、before image(解析SQL,查询一次数据库)、after image(查询一 次数据库)、insert undo log(写一次数据库)、before commit(与TC通讯,判断锁冲突),这些操作都需要一次远程通讯RPC,而 且是同步的。另外undo log写入时blob字段的插入性能也是不高的。每条写SQL都会增加这么多开销,粗略估计会增加5倍响应时间。
  • 性价比
为了进行自动补偿,需要对所有交易生成前后镜像并持久化,可是在实际业务场景下,这个是成功率有多高,或者说分布式事务失败 需要回滚的有多少比率?按照二八原则预估,为了20%的交易回滚,需要将80%的成功交易的响应时间增加5倍,这样的代价相比于让应用开发一个补偿交易是否是值得?
  • 全局锁热点数据
相比XA,Seata 虽然在一阶段成功后会释放数据库锁,但一阶段在commit前全局锁的判定也拉长了对数据锁的占有时间,这个开销 比XA的prepare低多少需要根据实际业务场景进行测试。全局锁的引入实现了隔离性,但带来的问题就是阻塞,降低并发性,尤其是热点 数据,这个问题会更加严重。
  • 回滚锁释放时间
Seata在回滚时,需要先删除各节点的undo log,然后才能释放TC内存中的锁,所以如果第二阶段是回滚,释放锁的时间会更长。
  • 死锁问题
Seata的引入全局锁会额外增加死锁的风险,但如果出现死锁,会不断进行重试,最后靠等待全局锁超时,这种方式并不优雅,也延 长了对数据库锁的占有时间。

 2. Seata快速开始

2.1 Seata Server(TC)环境搭建

https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html
步骤一:下载安装包
https://github.com/seata/seata/releases
下载对应版本对应操作系统的解压即可。

 步骤二:配置

Server端存储模式(store.mode)支持三种:

file:(默认)单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高(默认)
db:(5.7+)高可用模式,全局事务会话信息通过db共享,相应性能差些
打开config/file.conf  
修改mode="db"
修改数据库连接信息(URL\USERNAME\PASSWORD)


## transaction log store, only used in seata-server
store {## store mode: file、db、redismode = "db"## database store propertydb {## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.datasource = "druid"## mysql/oracle/postgresql/h2/oceanbase etc.dbType = "mysql"driverClassName = "com.mysql.jdbc.Driver"url = "jdbc:mysql://127.0.0.1:3306/seata_server"user = "root"password = "root"minConn = 5maxConn = 30globalTable = "global_table"branchTable = "branch_table"lockTable = "lock_table"queryLimit = 100maxWait = 5000}
}

创建数据库seata_server

新建表:可以去seata提供的资源信息中下载:
seata/script at 1.3.0 · seata/seata · GitHub
\script\server\db\mysql.sq

-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(`xid`                       VARCHAR(128) NOT NULL,`transaction_id`            BIGINT,`status`                    TINYINT      NOT NULL,`application_id`            VARCHAR(32),`transaction_service_group` VARCHAR(32),`transaction_name`          VARCHAR(128),`timeout`                   INT,`begin_time`                BIGINT,`application_data`          VARCHAR(2000),`gmt_create`                DATETIME,`gmt_modified`              DATETIME,PRIMARY KEY (`xid`),KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(`branch_id`         BIGINT       NOT NULL,`xid`               VARCHAR(128) NOT NULL,`transaction_id`    BIGINT,`resource_group_id` VARCHAR(32),`resource_id`       VARCHAR(256),`branch_type`       VARCHAR(8),`status`            TINYINT,`client_id`         VARCHAR(64),`application_data`  VARCHAR(2000),`gmt_create`        DATETIME(6),`gmt_modified`      DATETIME(6),PRIMARY KEY (`branch_id`),KEY `idx_xid` (`xid`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(`row_key`        VARCHAR(128) NOT NULL,`xid`            VARCHAR(128),`transaction_id` BIGINT,`branch_id`      BIGINT       NOT NULL,`resource_id`    VARCHAR(256),`table_name`     VARCHAR(32),`pk`             VARCHAR(36),`status`         TINYINT      NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',`gmt_create`     DATETIME,`gmt_modified`   DATETIME,PRIMARY KEY (`row_key`),KEY `idx_status` (`status`),KEY `idx_branch_id` (`branch_id`),KEY `idx_xid` (`xid`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE IF NOT EXISTS `distributed_lock`
(`lock_key`       CHAR(20) NOT NULL,`lock_value`     VARCHAR(20) NOT NULL,`expire`         BIGINT,primary key (`lock_key`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
注意:
redis:Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置适合当前场景的redis持久化配置
资源目录:https://github.com/seata/seata/tree/1.3.0/script
client
存放client端sql脚本,参数配置
config-center
各个配置中心参数导入脚本,config.txt(包含server和client,原名nacos-config.txt)为通用参数文件
server
server端数据库脚本及各个容器配置

db存储模式+Nacos(注册&配置中心)部署  

步骤三:配置Nacos注册中心    负责事务参与者(微服务) 和TC通信
将Seata Server注册到Nacos,修改conf目录下的registry.conf配置
registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype = "nacos"nacos {application = "seata-server"serverAddr = "127.0.0.1:8848"group = "SEATA_GROUP"namespace = ""cluster = "default"username = "nacos"password = "nacos"}
}config {# file、nacos 、apollo、zk、consul、etcd3type = "nacos"nacos {serverAddr = "127.0.0.1:8848"namespace = ""group = "SEATA_GROUP"username = "nacos"password = "nacos"}
}
步骤四:配置Nacos配置中心
步骤三中截图已经包含本步骤。
注意:如果配置了seata server使用nacos作为配置中心,则配置信息会从nacos读取,file.conf可以不用配置。 客户端配置registry.conf 使用nacos时也要注意group要和seata server中的group一致,默认group是"DEFAULT_GROUP"

 步骤五:配置参数同步到Nacos  

获取/seata/script/config-center/config.txt,修改配置信息
精简配置:
service.vgroupMapping.my_test_tx_group=default
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true
store.db.user=root
store.db.password=root
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
配置事务分组, 要与客户端配置的事务分组一致my_test_tx_group需要与客户端保持一致  default需要跟客户端和registry.conf中registry中的cluster保持一致 (客户端properties配置:spring.cloud.alibaba.seata.tx‐service‐group=my_test_tx_group)
事务分组:异地机房停电容错机制
my_test_tx_group 可以自定义  比如:(guangzhou、shanghai...) , 对应的client也要去设置
seata.service.vgroupmapping.projectA=guangzhou,default   必须要等于 registry.confi  cluster = "default"

运行nacos-config.sh脚本将配置信息同步到nacos,如果nacos开启认证模式则需要在执行脚本时加上用户名和密码(-u 用户名 -w 密码)。

sh ${SEATAPATH}/script/config‐center/nacos/nacos‐config.sh ‐h localhost ‐p 8848 ‐g SEATA_GROUP ‐t 5a3c7d6c‐f497‐
4d68‐a71a‐2e5e3340b3ca
参数说明:
-h: host,默认值 localhost
-p: port,默认值 8848
-g: 配置分组,默认值为 'SEATA_GROUP'
-t: 租户信息,对应 Nacos 的命名空间ID字段, 默认值为空 ''

执行成功后,在nacos控制台可以看到

步骤六:启动Seata Server
源码启动: 执行server模块下io.seata.server.Server.java的main方法
命令启动: bin/seata-server.sh -h 127.0.0.1 -p 8091 -m db -n 1 -e test

 

 启动Seata Server,启动成功,默认端口8091

bin/seata‐server.sh ‐p 8091 ‐n 1

 在注册中心中可以查看到seata-server注册成功

3. Seata Client快速开始 

声明式事务实现(@GlobalTransactional)
接入微服务应用
业务场景:
用户下单,整个业务逻辑由三个微服务构成:
订单服务:根据采购需求创建订单。         
库存服务:对给定的商品扣除库存数量。 

1)启动Seata server端,Seata server使用nacos作为配置中心和注册中心(上一步已完成)
2)配置微服务整合seata
第一步:添加pom依赖
    <dependencies><!--nacos注册发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--        openfeig 远程调用--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--seata的依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency></dependencies>
第二步: 各微服务对应数据库中添加undo_log表

CREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL,`xid` varchar(100) NOT NULL,`context` varchar(128) NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int(11) NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
第三步:修改register.conf,配置nacos作为registry.type&config.type,对应seata server也使用nacos
注意:需要指定group = "SEATA_GROUP",因为Seata Server端指定了group = "SEATA_GROUP" ,必须保证一致
如果出现问题:
一般大多数情况下都是因为配置不匹配导致的:
1.检查现在使用的seata服务和项目maven中seata的版本是否一致
2.检查tx-service-group,nacos.cluster,nacos.group参数是否和Seata Server中的配置一致

第四步:修改application.yml配置(用到seata的模块都需要配置)

# 数据源
spring:datasource:username: rootpassword: rooturl: jdbc:mysql://localhost:3306/seata_order?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource#初始化时运行sql脚本schema: classpath:sql/schema.sqlinitialization-mode: neverapplication:name: alibaba-order-seatacloud:nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacosalibaba:seata:tx-service-group: my_test_tx_group
#设置mybatis
mybatis:mapper-locations: classpath:com/tulingxueyuan/order/mapper/*Mapper.xml#config-location: classpath:mybatis-config.xmltypeAliasesPackage: com.tulingxueyuan.order.pojoconfiguration:mapUnderscoreToCamelCase: true
server:port: 8070
seata:registry:# 配置seata的注册中心, 告诉seata client 怎么去访问seata server(TC)type: nacosnacos:server-addr: 127.0.0.1:8848 #seata-server所在的naocs服务地址application: seata-server  #seata-server服务名,默认seata-serverpassword: nacosusername: nacosgroup: SEATA_GROUP #默认SEATA_GROUPconfig:type: nacosnacos:server-addr: 127.0.0.1:8848 #seata-serverusername: nacospassword: nacosgroup: SEATA_GROUP

注意:配置seata 服务事务分组,要与服务端nacos配置中心中service.vgroup_mapping的后缀对应

第四步:微服务发起者(TM 方)需要添加@GlobalTransactional注解

 

测试
分布式事务成功,模拟正常下单、扣库存,扣余额
分布式事务失败,模拟下单扣库存成功、扣余额失败,事务是否回滚

4.demo源码:springcloudAlibaba: Alibaba微服务学习demo 



相关文章:

  • Flask电影网站项目
  • 《C++ primer plus》第15章:友元、异常和其他(4)
  • Android开发环境搭建
  • CS61B 2021spring HW0
  • 高阶数据结构 位图的介绍
  • 【时间复杂度和空间复杂度】
  • Linux产生死锁的必要条件和常见的锁种类
  • Python与Matlab混合编程案例
  • 17 | 如何做好面试复盘?将经验提升为能力
  • layui框架学习(1:布局)
  • Ubuntu安装wordpress
  • 【Linux】POSIX信号量
  • 【云原生】Prometheus 监控系统的初步了解与系统搭建
  • stack、queue、priority_queue
  • 高通平台开发系列讲解(GPS篇)gpsONE 系统架构
  • Lab 3: Midterm Review
  • C#手动操作DataGridView之------使用各种数据源填充表格实例
  • Python map() 使用方法及示例
  • 【Leetcode刷题】141、环形链表
  • 前同事居然因为 Pycharm 的这个功能,即使离职三年也依然经常被请去喝茶~
  • 量化选股——基于多因子模型的量化策略(第1部分—因子测算策略构建)
  • 【SpringCloud】Nacos集群搭建
  • 从源码解析代理模式
  • goto语句——“C”
  • 行为型模式-状态模式
  • C++学习/温习:新型源码学编程(一)
  • gcc中预定义的宏__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__
  • 【图卷积网络】02-谱域图卷积介绍
  • 分享148个ASP源码,总有一款适合您
  • 2023.1.25,周三【图神经网络 学习记录9】图网络的分类,异构图---注意力机制网络:节点级别的attention,语义级别的attention
  • Jetpack架构组件库:Room
  • kaggle竞赛 | 计算机视觉 | Doodle Recognition Challenge
  • 盖子的c++小课堂——第十三讲:二维数组
  • 打工人必知必会(二)——劳动合同解除
  • 数据结构 第三章 栈和队列(栈)
  • 大年初二、初三—— 牛客网刷题经验分享~
  • 利用Windows系统服务进行权限提升
  • 2021 XV6 8:locks
  • 排列的时候如何避免重复?
  • 机器学习【西瓜书/南瓜书】--- 第四章决策树
  • ffmpeg无损裁剪、合并视频
  • 《C++ primer plus》第15章:友元、异常和其他(3)
  • 3.7-2动态规划--图像压缩(举例子和写代码)
  • Java基础练习题(十二)
  • VBA提高篇_07 Goto跳转 / Exit退出 /VBA错误处理
  • 栈与队列总结
  • 最详细、最仔细、最清晰的几道python习题及答案(建议收藏哦)
  • Java基础练习题(十一)
  • 流批一体计算引擎-7-[Flink]的DataStream连接器
  • c++函数(2)
  • RabbitMQ-客户端源码之AMQChannel
  • 学习记录673@项目管理之进度管理案例
  • 【23】C语言 | 初阶结构体
  • k8s单机版使用本地存储local-path-provisioner
  • 【Git】Git 的基本使用
  • 【MySQL】第十二部分 子查询
  • WPF的APP生命周期以及全局异常捕获
  • C++初阶:vector类
  • 2022年度总结——2022我在CSDN的那些事暨2023我的目标展望:Pursue freedom Realize self-worth
  • 自动驾驶环境感知——视觉传感器技术
  • 机器学习中软投票和硬投票的不同含义和理解
  • 3.1(完结)Linux扫盲笔记
  • 冯诺依曼体系结构及操作系统(OS)的简单认识
  • 返回值的理解
  • Linux常见命令 25 - RPM包安装、升级、卸载、查询、校验、提取
  • 【Typescript学习】使用 React 和 TypeScript 构建web应用(三)所有组件
  • 【VisualBasicApplication】Excel编程
  • Linux系统之网络客户端工具
  • uniapp组件传参方式梳理
  • 手把手教你如何在项目中使用阿里字体图标IconFont
  • C语言函数调用详解
  • 离散系统的数字PID控制仿真-3
  • Day11 AOP介绍
  • 本质安全设备标准(IEC60079-11)的理解(三)
  • Let’s Encrypt SSL 证书的申请与使用
  • Linux——动态库
  • leetcode刷题记录总结-3. 哈希表
  • linux基本功系列之-rpm命令实战
  • 时序数据处理中的拟合问题
  • 3小时精通opencv(五) 利用TrackBar进行颜色检测
  • 数学建模学习笔记(9)多元线性回归分析(非常详细)
  • Python爬虫教你爬取视频内容
  • 数据库02_函数依赖,数据库范式,SQL语句关键字,数据库新技术---软考高级系统架构师009
  • 如何好好说话-第12章 理清楚问题就是答案
  • Java链表OJ题
  • 前端布局神器display:flex
  • Jetpack架构组件库:Hilt
  • Java基础语法——运算符与表达式
  • 安装mysql 5.7.24
  • 一周学习总结(2022.1.25)
  • CSS基础学习
  • Linux文件系统(IO缓冲区+磁盘+软硬链接)
  • 【servlet篇】HTTP协议相关知识点
  • Java---微服务---RabbitMQ入门与应用
  • 7.3 矩阵范数
  • JMeter测试redis性能
  • 【设计模式】结构型模式·组合模式
  • 第十三届蓝桥杯省赛 Java A 组 I 题、Python A 组 I 题、Python B 组 J 题——最优清零方案(AC)
  • 41.Isaac教程--使用DOPE进行3D物体姿态估计
  • 【Linux】gdb调试器的使用
  • 互联网摸鱼日报(2023-01-26)
  • python语法 dot函数
  • Docker 基础 - 3
  • 如何使用Maven构建Java项目?Maven的使用详细解读
  • RISC-V Assembler Modifiers
  • VMware虚拟机无法向宿主机拖放文件
  • Mybatis-Plus 多记录操作与逻辑删除
  • 【Python语言基础】——Python 迭代器
  • [Python]调用pytdx的代码示例
  • 【Linux】目录权限和默认权限
  • APT之木马静态免杀
  • Python装饰器使用方法详解
  • SpringBoot+Vue项目在线视频教育平台
  • 利用Golang可选参数实现可选模式
  • 游戏启动器:LaunchBox Premium with Big Box v13.1
  • CSS权威指南(十)浮动
  • RESTful的意义及其使用规则
  • SpringMVC总结
  • Android MVVM的实现
  • 0、Spring工程构建Spring快速入门Spring配置文件详解注入Sprint相关API
  • PostGIS:ST_AREA面积计算
  • 厚积薄发打卡Day115:Debug设计模式<简单工厂、工厂方法、抽象工厂>
  • 【MySQL进阶】MySQL视图详解
  • kubernetes资源对象应用类(二)
  • 线程控制--Linux
  • 测试篇(三):测试用例的万能公式、对水杯和登录页面设计测试用例、测试用例的设计方法
  • 面试屡次碰壁后,我是如何调整最终拿下一线大厂offer的?
  • 在甲骨文云容器实例(Container Instances)上部署Oracle Linux 8 Desktop加强版(包括Minio,ssh登录等)
  • 重学python
  • Java 方法
  • 分享142个ASP源码,总有一款适合您
  • 树型结构——二叉数
  • 2-SAT
  • 8. 好客租房-WebSocket与即时通讯系统[项目必需]
  • Linux 命令(249)—— unset 命令(builtin)
  • 【1】初识Linux
  • 数据结构---堆
  • python元组
  • 【My Electronic Notes系列——直流稳压电源】
  • 有关Android的TextView组件的几个问题
  • Spring核心模块解析—BeanDifinition。
  • JavaEE多线程-定时器
  • C++编译之(4)-进阶-cmake设置install及package配置
  • 【每日一道智力题】之坤坤猜生日(面试高频)
  • 斐波那契数列的--------5种算法(又称“兔子数列”)
  • Java基础 IO
  • Extractor.app学习
  • 深入学习Vue.js(十四)同构渲染
  • Spring笔记上(基于注解开发)
  • 定位 position属性 相对定位 绝对定位 固定定位 定位下的居中 多个定位元素重叠时 补充
  • NLP | 打造一个‘OpenAI智能’机器人,只需要五分钟
  • 好的质量+数量 = 健康的创作者生态
  • 设计一个70W在线人数的弹幕系统
  • JavaWeb | 揭开SQL注入问题的神秘面纱
  • 【编程入门】开源记事本(微信小程序版)
  • 2022年复盘:越走越偏
  • C语言深度解剖-关键字(1)
  • 千峰学习【Ajax】总结
  • 【设计模式】结构型模式·享元模式
  • Redis实现好友关注 | 黑马点评
  • Ubuntu 20.04 下 部署 SoftEther
  • Python OS 文件目录方法 os.walk()
  • 《Buildozer打包实战指南》第七节 打包资源文件
  • 关于非授权访问的逻辑漏洞挖掘
  • 数据结构-树
  • JavaWeb项目中添加live2d模型
  • VBA提高篇_05日期时间函数
  • HackTheBox Stocker API滥用,CVE-2020-24815获取用户shell,目录遍历提权
  • 正则表达式(转载)
  • 【Android】开发一个简单时钟应用每天看时间起床
  • 常见DEM数据汇总
  • 如何设计一个 70w 在线人数的弹幕系统
  • “华为杯”研究生数学建模竞赛2005年-【华为杯】D题:仓库容量有限条件下的随机存贮管理(附获奖论文)
  • 3000字英文随笔(挽救下语感)
  • MS-Model【3】:Medical Transformer
  • 2023第五届中国眼博会,北京眼睛健康展,北京护眼仪展
  • 【JavaEE初阶】第六节.多线程 (基础篇 )线程安全问题(下篇)
  • 好客租房-09_学习MongoDB并完善通讯系统
  • 提权漏洞和域渗透历史漏洞整理
  • OCR文字识别基础
  • 辗转相除以及辗转相减法
  • 【Linux】多线程同步与互斥
  • 【HBase入门】5. 常用 Shell 操作(2)
  • 构造函数的4种使用方式总结
  • 如何取消PDF文件的保护设置?
  • 第二章 物理层
  • JAVA中static、final、static final的区别
  • 行为型模式-命令模式
  • 在线工具轻松设计电商直通车主图,无需下载
  • 水面漂浮物垃圾识别检测系统 YOlOv7
  • 【蓝桥云课】位运算
  • 2023-1-24 刷题情况
  • Java面试题,mysql相关基础问题(全是自己的总结,如有不对,敬请斧正)
  • flask框架全解
  • 机器视觉_HALCON_HDevelop用户指南_1.HDevelop介绍
  • C 语言零基础入门教程(九)
  • 机器学习(七):Azure机器学习模型搭建实验
  • JavaScript总结
  • 90. 注意力分数及代码实现
  • 从技术角度看Android大系统的构成
  • 如何设计一个70W在线人数的弹幕系统文章分析
  • TPH-YOLOv5
  • 前缀树 字典树 TrieTree的学习与模拟实现
  • vue2升级vue3:vue3真的需要vuex或者Pinia吗?hooks全有了
  • 如何好好说话第11章 攀登抽象之梯
  • 模型压缩(model compression)
  • 如何安装双系统与多系统(带你快速了解)
  • JAVA基础知识08集合基础
  • java-List
  • 超级详解洛谷P4011 孤岛营救问题(bfs超难题)(保证看懂)
  • Linux- 系统随你玩之--文本处理三剑客-带头一哥-awk
  • [JavaEE]线程池
  • java选择结构与switch case语句
  • MySQL 安装包下载
  • 小动画制作时需要的知识点
  • STM32+python产生三角波
  • 【刷题大本营】二叉树进阶oj题(动图讲解,附代码及题目链接)
  • 【手写 Promise 源码】第二篇 - Promise 功能介绍与特性分析
  • RAID不同类型之间的区别
  • 机器学习(六):模型评估
  • spring boot前后端交互之数据格式转换
  • Java多线程案例之阻塞队列
  • 5-6中央处理器-多处理器系统硬件多线程
  • FME进阶视频教程: FME常用转换器之坐标系操作类,讲解在FME中如何操作矢量数据的坐标系
  • LeetCode(Array)1431. Kids With the Greatest Number of Candies
  • matplotlib嵌套南海子图
  • 91.使用注意力机制的seq2seq以及代码实现
  • 目录生成测试
  • 函数的认识
  • 笔试题-2023-华为-数字芯片【纯净题目版】
  • ROS学习寄录之知识学习
  • 传参的理解
  • 网狐大联盟非联盟成员无法创建房间解决-暂时不可创建当前游戏,请选择其他游戏!
  • MyBatisPlus入门简介
  • 对JDBC驱动注册--DriverManager.registerDriver和Class.forName(driverClass)的理解
  • 【老卫搞机】136期:华为开发者联盟社区2022年度战码先锋2期开源贡献之星
  • JVM快速入门学习笔记(四)
  • 第一章 概述
  • 【大数据管理】Java实现字典树TireTree
  • 第24章 Microsoft.Data.SqlClient中间件数据库生成
  • Mybatis 基本使用案例
  • 通过实例了解uprobe及其对性能的影响
  • linux基本功系列之wc命令实战
  • [GYCTF2020]EasyThinking (ThinkPHP V6.0.0)
  • [Linux]进程地址空间
  • 2023年最新Python常见编程面试题(1)精选30个题目附答案
  • pythpon基础:创建文件索引升级版
  • 【Python语言基础】——Python 继承
  • 24. 面向对象的思想
  • 【蓝桥杯-筑基篇】基础数学思维与技巧(1)
  • MyBatis的入门
  • Linux中的权限问题
  • leetcode72 编辑距离
  • Vue3【1.v-if 和 v-show 、2.动态组件、 3.网页的渲染 、4.v-for】
  • 高等数学(第七版)同济大学 习题12-8 个人解答
  • 计算机存储系统
  • 目标检测知识蒸馏---以SSD为例【附代码】
  • 【Kotlin】扩展函数 ③ ( 定义扩展文件 | 重命名扩展函数 | Kotlin 标准库扩展函数 )
  • 图论(入门版)
  • Linux存活指令和具体使用方法
  • ★ 我的世界各类奇葩武器实现!(命令方块1.13+)
  • 基于ImageAI的图像识别
  • 【论文阅读】吴恩达分享的论文阅读方法
  • DlhSoft Gantt Chart Light Library 4.3.47 Crack
  • Docker 解决 `denied: requested access to the resource is denied`
  • ROS学习寄录之环境搭建
  • 想要学会二叉树?树的概念与结构是必须要掌握的!快进来看看吧
  • MySQL事务的四大特性以及并发事务问题
  • SpringBoot-过滤器的使用(在访问页面时过滤掉未登录的用户使其不能访问相应页面)
  • ricequant量化的基础是什么?
  • 条款2:理解auto型别推导
  • Linux|奇怪的知识---CPU温度监控
  • 笔试题-2023-杰理科技-数字IC设计【纯净题目版】
  • 离线用户基于内容召回集
  • GPU虚拟化(留坑)
  • spingboot如何接受前端请求
  • python列表用法
  • 2023起点上,一段迷茫的自我倾诉
  • 数学小抄: 李群李代数再回顾 [SLAM十四讲]
  • Vuex里面四个map方法(mapState、mapGetters、mapActions、mapMutation)
  • CSS之浮动以及清除浮动的几种方式
  • 27. 作用域
  • Windows CMD命令大全
  • Python流程控制语句之循环语句
  • 好客租房-13.WebMagic
  • Springboot+java师生交流答疑作业系统
  • 基于Android的高校疫情防控信息系统的设计与实现
  • 通过Moonbeam的Connected Contracts互连合约从Axelar转移Token至Centrifuge
  • 77、TensoRF: Tensorial Radiance Fields
  • 基于Android的动漫之家系统的设计与实现
  • 【C++】深浅拷贝
  • Springboot整合Redis
  • 基于代理 Dao 实现 CRUD 操作
  • Java线程池(超详细)
  • ESP32设备驱动-8x8LED点阵驱动(基于Max7219+SPI)
  • Python-Flask-2023.1.24-Review
  • HTML学习
  • mysql之explain(性能分析)
  • C语言基础知识(38)
  • go 语言 string 类型思考
  • AxMath使用教程(持续更新中)
  • /proc/meminfo的理解vmtouch使用介绍内存碎片整理
  • 行为型模式-模板方法模式
  • WordPress整站源码安装说明(搬家换域名/服务器)的安装步骤
  • 最小化最大值+拓扑排序要点+概率
  • 十大经典排序算法(动态演示+代码)-选择排序与插入排序
  • 好客租房-12.ES接入java
  • 【Linux】Linux调试器——gdb使用
  • 5-5中央处理器-指令流水线
  • HTML基本常用标签
  • java+ssm网上书店图书销售评价系统
  • 【数据结构】详谈复杂度
  • Python函数(函数定义、函数调用)用法详解
  • Python基础学习 -- 常用模块
  • k8s安装nfs设置pv pvc并部署mysql
  • BERT模型结构可视化与模块维度转换剖析
  • 【LeetCode】计算右侧小于当前元素的个数 [H](归并排序)
  • 【每日一道智力题】三个火枪手(快来看人生哲理)
  • SaaS是什么,目前主流的国内SAAS平台提供商有哪些?
  • Opencv项目实战:19 手势控制鼠标
  • 2023 年第一弹, Flutter 3.7 发布啦,快来看看有什么新特性
  • 3.5动态规划--凸多边形的最优三角剖分
  • (python)selenium工具的安装及其使用
  • 对多线程中线程池的理解
  • 深度学习流行的框架有哪些?分别有什么特点
  • C++初阶--多态
  • Leetcode:46. 全排列、47. 全排列 II(C++)
  • LeetCode13罗马数字转整数
  • CE训练教程进阶,步骤 9: 注入++
  • 【21】C语言 | 几个经典数组练习题
  • VMWare 移动Linux CentOS 7虚拟机后连不上网怎么办
  • 【Ubuntu】Nacos 2.1 单机安装
  • LeetCode 2520. 统计能整除数字的位数
  • “深度学习”学习日记。与学习有关的技巧--Bacth Normalization
  • Ubuntu下为可执行文件和脚本文件(.sh)生成桌面快捷方式
  • 【c语言进阶】结构体最常用知识点大全
  • 30. PyQuery: 基于HTML的CSS选择器
  • 初出茅庐——索引和文档的基本操作
  • C++:类中const修饰的成员函数
  • AtCoder Beginner Contest 285 题解
  • 2023年springcloud面试之Eureka(第二部分)
  • 为 TDesignBlazor 添加暗黑模式
  • DFS(六) N皇后 II
  • Linux中的工具使用【vim的存活级】
  • JavaScript 所见所得文本编辑器 Froala Editor 4.0.17Crack
  • Allegro如何自动做差分对内等长操作指导
  • 洛谷-P2114 [NOI2014] 起床困难综合症
  • 【学习笔记】[AGC023E] Inversions
  • JDBC连接池多线程通过CountDownLatch实现线程并发执行
  • ISIS简介、NSAP与NET地址、Router-Id转换成NET地址
  • 【GIS】高分辨率遥感影像智能解译
  • C语言基础 — ( C语言库函数<stdio.h>——C标准的内容)
  • AI算法(三)plt基础
  • final的一个重要用途-宏变量和未初始化问题
  • C++空间命名
  • 快速排序的实现和优化~
  • macOS Ventura 13.2 (22D49) 正式版发布,ISO、IPSW、PKG 下载
  • MS Access数据库多数据源JDBC查询
  • 十大经典排序算法(动态演示+代码)-堆排序
  • Python3 round() 函数
  • 信息论复习—连续信源、信道及容量
  • RadSystems Studio 8.1.8 Crack
  • 【自然语言处理】情感分析(一):基于 NLTK 的 Naive Bayes 实现
  • 【MySQL】第十一部分 SELECT的执行过程
  • 【目标跟踪】------deepsort
  • 2023牛客寒假算法集训营3
  • 基于Springboot vue前后端分离在线培训考试系统源码
  • MyBatis基本使用及XML配置
  • Java数组
  • [数据结构基础]排序算法第一弹 -- 直接插入排序和希尔排序
  • 鱼雷的发射角设置
  • 深度学习数据标注_Lableme
  • JavaWeb语法八:网络原理初识
  • 基于STM32的FreeRTOS开发(1)----FreeRTOS简介
  • 搭建本地Maven仓库
  • 算法:树状数组详解(c++实现 求解动态数组区间和问题)
  • 《深入浅出计算机组成原理》学习笔记 Day10
  • day 19 暴力枚举
  • 尚医通-手机登录-判断用户登录状态-用户网关整合(三十)
  • 使用Vue 简化 用户查询/添加功能
  • emoji 符号大全,给各位程序员增加一些奇怪的知识点
  • Mysql入门技能树-数据类型
  • Eclipse导入python项目
  • 简明Java讲义 2:数据类型和运算符
  • 【JavaWeb】JavaScript基础语法(下)
  • 56. 合并区间 738.单调递增的数字
  • 数据库和SQL概述
  • 力扣刷题记录——645. 错误的集合、657. 机器人能否返回原点、674. 最长连续递增序列
  • AtCoder Regular Contest 149
  • 常用的负载均衡算法
  • 恶意代码分析实战 14 反虚拟机技术
  • Mine Goose Duck 0.2版本发布
  • 离线用户召回定时更新
  • MP-4可燃气体传感器介绍
  • 【设计模式】结构型模式·外观模式
  • C C++实现两矩阵相乘--模拟法
  • 服务器配置定时脚本 crontab + Python;centos6或centos 7或centos8 实现定时执行 python 脚本
  • git 操作整理
  • ESP32设备驱动-TSL2561亮度传感器驱动
  • SOLID原则总结
  • 机器学习笔记之深度玻尔兹曼机(二)深度玻尔兹曼机的预训练过程
  • [Android开发基础1] 五大常用界面布局
  • JavaEE day4 初识HTML+总结3
  • 【C#】WPF实现经典纸牌游戏,适合新手入门
  • LA@determinant@行列式@Vandermonde行列式
  • python爬虫学习笔记-mysql数据库介绍下载安装
  • Linux使用YUM源安装Docker
  • Prometheus学习整理-Prometheus-operator
  • Python(for和while)循环嵌套及用法
  • Elasticsearch:Elasticsearch percolate 查询
  • mysql之索引
  • 【Linux】文件权限
  • MySQL内外连接
  • 04_iic子系统
  • IPV4地址详解
  • 矩阵理论复习(六)
  • AX7A200教程(4): DDR3的读写fifo仿真
  • 2023牛寒2--Tokitsukaze and Three Integers
  • [ 华为云 ] 云计算中Region、VPC、AZ 是什么,他们又是什么关系,应该如何抉择
  • 【电动车】基于多目标优化遗传算法NSGAII的峰谷分时电价引导下的电动汽车充电负荷优化研究(Matlab代码实现)
  • 20230125英语学习
  • Linux常见命令 8 - 其他文件搜索命令 locate, which, whereis, grep
  • 前端艺术之毛玻璃-倾斜-日历
  • Java基础 Stream流方法引用异常文件
  • TCP/IP IP地址概念与应用
  • 手把手教你写一个极简版Netty
  • Tkinter的Checkbutton控件
  • 汇编语言学习 下
  • 二叉树基础oj练习
  • fpga实操训练(系统开发和硬件接口)
  • 审批工作流—ccflow
  • ThreadLocal详解
  • Java大数值与浮点数计算
  • cmake 05 使用库
  • 浏览器使用本地硬盘上的JS文档
  • Python基础学习七
  • Java IO流之字符流详解
  • 二叉树专题汇总
  • 多个盒子排列规则(视觉格式化模型) 多个盒子的排列 页面布局
  • Linux下动静态库的打包与使用C C++
  • ubuntu 22.04学习笔记
  • 2023年网络安全比赛--中间件渗透测试中职组(超详细)
  • Python初学者看过来啊,老油条来复习
  • 单绞机控制算法模型(Simulink仿真)
  • 十二、创建和管理表
  • MySQL HA(High Availability) 数据库高可用工具Orchestrator安装
  • 通信原理简明教程 | 基本概念
  • 【头歌】单链表的排序操作
  • Mysql入门技能树-使用数据库
  • Java线程池
  • 恶意代码分析实战 1 静态分析基础技术
  • 恶意代码分析实战 7 WinDbg
  • Vue-Router详解
  • PHP 实例 - AJAX 实时搜索
  • 【MySQL】存储引擎
  • 《MLB美职棒大联盟》:年度最佳教练奖·棒球1号位
  • 19、Javaweb案例-登录功能
  • 【Git :分布式版本控制工具】
  • jvm面试题汇总
  • 电商项目之同一笔单多次收款成功
  • 零基础学JavaWeb开发(二十二)之 springmvc入门到精通(2)
  • Issues with peer dependencies found
  • CSS 艺术之心形-彩虹-加载动画
  • Python---自动生成二维码
  • Java集合常见面试题(四)
  • input 实现回车失焦,考虑输入法的情况
  • 高等数学【合集2】
  • 雅睿生物在创业板IPO终止:安信证券为保荐人,曾计划募资7.5亿元
  • 【操作系统】—— Windows常用快捷键(带你快速了解)
  • 基于Andriod的智慧校园卡系统的设计与实现
  • (18)go-micro微服务ELK介绍
  • OSG三维渲染引擎编程学习之二十八:“第三章:OSG场景组织” 之 “3.10 Switch开关节点”
  • 动态站点地图提交百度收录
  • 【价格型需求响应】基于Logistic函数的负荷转移率模型需求响应研究(Matlab代码实现)
  • javascript中Math.random()产生随机数进行随机点名
  • Hyperbolic geometry (双曲几何简介)
  • 【Leetcode每日一题】34.在排序数组中查找元素的第一个和最后一个位置|二分求下标
  • 【JavaEE】如何开始基础的Servlet编程(基于Tomcat服务器)
  • 【SpringCloud20】SpringCloud Alibaba Seata处理分布式事务
  • MODBUS总线的学习笔记
  • OSG三维渲染引擎编程学习之二十七:“第三章:OSG场景组织” 之 “3.9 AutoTransform自动对齐节点”
  • 最实用的 Docker 知识(一)
  • Leetcode:78. 子集、90. 子集 II(C++)
  • 1月23日Linux c编程之Makefile
  • UPS BP650CH实现nas自动关机
  • MySQL —— 库操作
  • ❤️如何实现所谓的“关键字传参”--理论+易懂版⭐
  • 【JavaEE】认识线程Thread类及常用方法线程状态
  • Shell语法
  • MP-2平面烟雾气体传感器介绍
  • springboot中restful风格请求的使用
  • 【19】C语言 | 三子棋
  • 【每日一题Day97】LC1828统计一个圆中点的数目 | 模拟
  • 议论文书写总结
  • Day869.索引(下) -MySQL实战
  • 离线召回与排序介绍
  • 【Ajax】防抖和节流
  • CMAKE
  • 【面试克星】【公式少代码少话多】Vins-Mono预积分相关知识点总结与概述
  • C语言基础知识(36)