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

【商城实战(93)】商城高并发实战:分布式锁与事务处理深度剖析

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想深入钻研技术细节,还是探寻商城运营之道,本专栏都能提供从 0 到 1 的系统讲解,助力你打造独具竞争力的电商平台,开启电商实战之旅。

目录

  • 一、引言
  • 二、分布式锁在高并发下的应用
    • 2.1 高并发下的资源竞争问题
    • 2.2 Redis 分布式锁原理
    • 2.3 Spring Boot 集成 Redis 实现分布式锁
  • 三、分布式事务处理
    • 3.1 跨服务事务问题
    • 3.2 Seata 分布式事务框架介绍
    • 3.3 Seata 管理分布式事务示例
  • 四、性能优化
    • 4.1 分布式锁性能优化
    • 4.2 分布式事务性能优化
  • 五、总结与展望


一、引言

在当今电商行业蓬勃发展的背景下,商城系统面临着前所未有的高并发挑战。大量用户同时涌入商城进行商品浏览、下单、支付等操作,这对系统的稳定性和数据一致性提出了极高的要求。分布式锁与事务处理作为应对高并发场景的关键技术手段,对于保障商城系统的正常运行起着至关重要的作用。如果不能妥善处理高并发下的资源竞争和跨服务事务问题,将会导致数据不一致、超卖、订单状态混乱等一系列严重影响用户体验和商城运营的问题。因此,深入理解并合理运用分布式锁与事务处理技术,是打造高性能、高可靠商城系统的核心要点。

二、分布式锁在高并发下的应用

2.1 高并发下的资源竞争问题

在高并发场景中,多个请求同时访问共享资源时,资源竞争问题极易出现。以商城商品库存扣减为例,当一款热门商品进行促销活动时,大量用户可能同时发起购买请求。如果系统没有采取有效的并发控制措施,就可能出现多个线程同时读取到相同的库存数量,然后各自进行扣减操作,最终导致库存数量出现负数,即超卖现象。这不仅会给商城带来经济损失,还会严重影响用户体验,损害商城的信誉。

2.2 Redis 分布式锁原理

Redis 分布式锁是基于 Redis 的单线程特性和原子操作来实现的。其核心原理是利用SETNX(SET if Not eXists)命令,该命令只有在键不存在时才会设置键的值。当一个客户端尝试获取分布式锁时,它会向 Redis 发送一个SETNX命令,若返回值为1,表示获取锁成功,因为此时锁对应的键不存在;若返回值为0,则表示锁已被其他客户端获取,获取锁失败。同时,为了防止锁被意外持有而无法释放,通常会给锁设置一个过期时间。例如,在一个典型的商品秒杀场景中,多个客户端同时竞争获取商品库存扣减的锁,只有获取到锁的客户端才能执行库存扣减操作,其他客户端则需要等待或重试。

2.3 Spring Boot 集成 Redis 实现分布式锁

  1. 添加依赖:在 Spring Boot 项目的pom.xml文件中添加spring-boot-starter-data-redis依赖,代码如下:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置连接信息:在application.properties文件中配置 Redis 服务器的地址、端口等信息,示例如下:
spring.redis.host=your - redis - host
spring.redis.port=6379
spring.redis.password=your - password
  1. 实现分布式锁代码:创建一个工具类RedisLockUtil,使用RedisTemplate实现获取和释放分布式锁的功能。核心代码如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;@Component
public class RedisLockUtil {@Autowiredprivate RedisTemplate<String, String> redisTemplate;public boolean tryLock(String lockKey, String requestId, long expireTime) {return redisTemplate.opsForValue().setIfAbsent(lockKey, requestId, expireTime, TimeUnit.SECONDS);}public void unlock(String lockKey, String requestId) {String value = redisTemplate.opsForValue().get(lockKey);if (requestId.equals(value)) {redisTemplate.delete(lockKey);}}
}

在商品秒杀业务代码中使用分布式锁,示例如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;@RestController
@RequestMapping("/seckill")
public class SeckillController {@Autowiredprivate RedisLockUtil redisLockUtil;@PostMapping("/product/{productId}")public String seckillProduct(@PathVariable Long productId) {String lockKey = "seckill:product:" + productId;String requestId = UUID.randomUUID().toString();boolean locked = redisLockUtil.tryLock(lockKey, requestId, 10);if (locked) {try {// 执行商品秒杀业务逻辑,如扣减库存等return "秒杀成功";} finally {redisLockUtil.unlock(lockKey, requestId);}} else {return "秒杀失败,商品已售罄或系统繁忙";}}
}

三、分布式事务处理

3.1 跨服务事务问题

在商城系统中,创建订单这一常见业务操作通常涉及多个服务间的协同工作。例如,当用户下单时,订单服务需要创建订单记录,库存服务需要扣减相应商品的库存,账户服务需要扣减用户的余额。这些操作必须作为一个整体要么全部成功,要么全部失败,以保证数据的一致性。然而,由于这些服务可能部署在不同的服务器上,且网络通信存在不确定性,传统的本地事务无法满足这种跨服务的事务需求。如果在创建订单过程中,订单服务成功创建了订单记录,但库存服务扣减库存失败,而此时订单状态已经更新为已创建,就会导致数据不一致,用户可能会收到订单创建成功但商品无货的情况,严重影响用户体验和商城的正常运营。

3.2 Seata 分布式事务框架介绍

  1. Seata 组件与原理:Seata 是一款开源的分布式事务解决方案,它由三个核心组件组成:事务协调器(TC)、事务管理器(TM)和资源管理器(RM)。其工作原理如下:当一个分布式事务开始时,TM 向 TC 申请开启一个全局事务,并获取一个全局唯一的事务 ID(XID)。在各个服务的业务操作中,RM 负责向 TC 注册分支事务,并将本地事务的执行结果汇报给 TC。当所有分支事务都执行完毕后,TM 根据所有分支事务的执行情况向 TC 发起全局事务的提交或回滚请求。TC 根据全局事务的状态协调各个 RM 完成最终的事务提交或回滚操作,从而保证分布式事务的一致性。
  2. Seata 与 MyBatis-plus 集成:在 Spring Boot 项目中,首先需要在pom.xml文件中引入 Seata 和 MyBatis - plus 相关依赖,示例如下:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring - cloud - alibaba - seata</artifactId>
</dependency>
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis - plus - boot - starter</artifactId>
</dependency>

然后,在application.properties文件中添加 Seata 的配置信息,如事务协调器地址等,示例如下:

spring.application.name=mall - service
seata.tx - service - group=mall_tx_group
seata.service.vgroup - mapping.mall_tx_group=default
seata.config.type=file
seata.config.file.conf - file - path=classpath:seata/registry.conf
seata.registry.type=file
seata.registry.file.filename=classpath:seata/file.conf

3.3 Seata 管理分布式事务示例

  1. 业务场景模拟:假设商城数据库中有三张表,分别是order_info(订单表)、product_stock(商品库存表)和user_account(用户账户表)。表结构如下:
CREATE TABLE order_info (id BIGINT AUTO_INCREMENT PRIMARY KEY,user_id BIGINT NOT NULL,product_id BIGINT NOT NULL,order_amount DECIMAL(10, 2) NOT NULL,order_status INT NOT NULL
);CREATE TABLE product_stock (id BIGINT AUTO_INCREMENT PRIMARY KEY,product_id BIGINT NOT NULL,stock INT NOT NULL
);CREATE TABLE user_account (id BIGINT AUTO_INCREMENT PRIMARY KEY,user_id BIGINT NOT NULL,balance DECIMAL(10, 2) NOT NULL
);

初始化数据如下:

INSERT INTO product_stock (product_id, stock) VALUES (1, 100);
INSERT INTO user_account (user_id, balance) VALUES (1, 1000.00);
  1. 代码实现:在订单服务中,创建订单并调用库存服务和账户服务的关键代码如下:
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate StockService stockService;@Autowiredprivate AccountService accountService;@GlobalTransactional@Transactionalpublic void createOrder(Long userId, Long productId, BigDecimal orderAmount) {// 创建订单记录OrderInfo orderInfo = new OrderInfo();orderInfo.setUserId(userId);orderInfo.setProductId(productId);orderInfo.setOrderAmount(orderAmount);orderInfo.setOrderStatus(0);orderMapper.insert(orderInfo);// 调用库存服务扣减库存stockService.reduceStock(productId, 1);// 调用账户服务扣减用户余额accountService.reduceBalance(userId, orderAmount);}
}

库存服务扣减库存代码如下:

import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class StockService {@Autowiredprivate StockMapper stockMapper;@Transactionalpublic void reduceStock(Long productId, int quantity) {Stock stock = stockMapper.selectById(productId);if (stock.getStock() >= quantity) {stock.setStock(stock.getStock() - quantity);stockMapper.updateById(stock);} else {throw new RuntimeException("库存不足");}}
}

账户服务扣减用户余额代码如下:

import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;@Service
public class AccountService {@Autowiredprivate AccountMapper accountMapper;@Transactionalpublic void reduceBalance(Long userId, BigDecimal amount) {Account account = accountMapper.selectById(userId);if (account.getBalance().compareTo(amount) >= 0) {account.setBalance(account.getBalance().subtract(amount));accountMapper.updateById(account);} else {throw new RuntimeException("余额不足");}}
}

四、性能优化

4.1 分布式锁性能优化

  1. 减少锁持有时间:在业务代码中,应尽量优化逻辑,将需要在锁保护下执行的代码块缩到最小。例如,在商品秒杀场景中,对于一些非关键的业务逻辑,如记录日志、发送通知等,可以在获取锁之前或释放锁之后异步执行,而不是在锁持有期间同步执行。这样可以显著减少锁的持有时间,提高系统并发性能,让更多的请求能够及时获取锁并执行核心业务操作。
  2. 锁粒度控制:合理控制锁的粒度至关重要。以商城的商品管理为例,如果对整个商品模块进行全局加锁,当一个用户对某一个商品进行库存更新时,其他用户对所有商品的操作都将被阻塞,严重影响系统并发性能。而如果将锁粒度细化到单个商品,即每个商品对应一个锁,那么不同用户对不同商品的操作就可以并行进行,大大提高了系统的并发处理能力。但需要注意的是,锁粒度过细也可能会带来锁的管理成本增加等问题,因此需要根据实际业务场景进行权衡。

4.2 分布式事务性能优化

  1. 优化事务隔离级别:不同的事务隔离级别对性能有着不同程度的影响。在商城业务场景中,应根据具体业务需求选择合适的事务隔离级别。例如,对于一些读多写少且对数据一致性要求不是特别高的业务,如商品浏览统计等,可以选择较低的事务隔离级别,如READ_COMMITTED,以减少事务之间的锁竞争,提高系统并发性能。而对于涉及资金交易、库存扣减等对数据一致性要求极高的业务,则需要选择较高的事务隔离级别,如SERIALIZABLE,虽然会在一定程度上降低并发性能,但能确保数据的绝对一致性。
  2. 异步处理与批量操作:在分布式事务中,采用异步处理和批量操作可以有效减少事务执行时间,提高系统吞吐量。例如,在订单创建成功后,发送订单确认邮件、更新用户积分等操作可以异步执行,而不是在事务中同步等待这些操作完成。同时,对于一些批量操作,如批量更新库存、批量创建订单记录等,应尽量避免逐条操作,而是采用批量 SQL 语句或批量处理框架,减少数据库交互次数,从而提高事务执行效率。

五、总结与展望

通过合理应用 Redis 分布式锁解决高并发下的资源竞争问题,以及采用 Seata 分布式事务框架处理跨服务事务,能够有效提升商城系统在高并发场景下的稳定性和数据一致性。同时,通过对分布式锁和事务处理性能的优化,如减少锁持有时间、控制锁粒度、优化事务隔离级别、采用异步处理和批量操作等措施,可以进一步提高系统的并发处理能力和运行效率。随着技术的不断发展,未来分布式锁和事务处理技术将不断演进,例如更高效的分布式锁算法、更智能的分布式事务协调机制等,我们需要持续关注并探索新的技术应用,以不断提升商城系统的性能和用户体验。

相关文章:

【商城实战(93)】商城高并发实战:分布式锁与事务处理深度剖析

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

【C++】模拟实现一颗二叉搜索树

❤️欢迎来到我的博客❤️ 前言 搜索二叉树是在二叉树的基础上加了一个特征&#xff1a;左子树的所有节点都小于根&#xff0c;右子树的所有节点都大于根&#xff08;每一颗子树都要满足&#xff09; 因为这个特性的存在&#xff0c;使得他特别擅长搜索数据 比如我要寻找10&a…...

vue 点击放大,图片预览效果

背景&#xff1a; 在vue框架element组件的背景下&#xff0c;我们对图片点击放大(单张)&#xff1b;如果是多张图片&#xff0c;要支持左右滑动查看多张图片(多张)。 图片单张放大&#xff0c;el-image图片组件&#xff0c;或者原生的img标签。previewSrcList string[单个] 图片…...

AI知识补全(七):AI Agent 智能代理是什么?

名人说&#xff1a;人生如逆旅&#xff0c;我亦是行人。 ——苏轼《临江仙送钱穆父》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;AI知识补全&#xff08;六&#xff09;&#xff1a;RLHF 人类反馈…...

Java 中各种锁的使用详解

Java 锁的使用详解 Java 提供了多种锁机制来处理并发编程中的同步问题。下面我将通过代码示例来展示各种锁的使用方法和特点。 锁的选择指南 以下是选择合适锁的指南&#xff1a; 基本锁类型演示 // 由于这是在 Node.js 环境中模拟 Java 锁的概念&#xff0c;我们将使用注释…...

【GreenHills】GHS解决客户端在连接的时候提示在黑名单

1、 文档目标 解决GHS网络版客户在客户端连接的时候出现黑名单的问题 2、 问题场景 用于解决GHS的网络版客户在搭建完服务端后&#xff0c;客户端去连接服务的时候出现提示“在黑名单中”等情况&#xff08;如图2-1和图2-2&#xff09;。但是在服务器上面并没有设置黑名单。 …...

智能运维时代的网络拓扑管理:乐维监控的架构可视化实践

在数字化转型的浪潮中&#xff0c;企业IT基础设施正经历着前所未有的复杂化进程。当数以千计的网络设备、服务器、存储系统构成庞大网络体系时&#xff0c;如何实现全局可视化管理已成为企业数字化转型的关键命题。乐维监控网络拓扑系统作为新一代智能运维平台的核心组件&#…...

GitHub美化个人主页3D图表显示配置操作

这个功能主要是用的这个开源仓库&#xff1a;https://github.com/yoshi389111/github-profile-3d-contrib 想看效果的话&#xff0c;我的个人主页&#xff1a;https://github.com/Sjj1024 开始操作 1.创建自己的github主页属性项目——跟你github用户名一致即可&#xff0c;…...

Arduino示例代码讲解:Serial Event example 连续事件例子

Arduino示例代码讲解:Serial Event example 连续事件例子 Serial Event example 连续事件例子功能概述硬件部分:软件部分:代码逐行解释定义变量`setup()` 函数`loop()` 函数`serialEvent()` 函数工作原理Serial Event example 连续事件例子 这段代码是一个Arduino示例程序,…...

Java基础关键_031_反射(一)

目 录 一、概述 二、获取 Class 的三种方式 1.Class.forName("完整全限定类名") 2.getClass() 3.class 属性 三、通过反射机制实例化对象 1.newInstance()&#xff08;已过时&#xff09; 2.配置文件利用反射机制实例化对象 四、反射 Class 的 Field 1.获取 P…...

verilog/systemverilog中的位序问题

verilog或者systemverilog中在使用位选择时&#xff0c;必须按照定义的大小端顺序进行位选操作&#xff0c;比如定义了reg [11:0] data&#xff0c;在使用data的中间4位时&#xff0c;必须使用data[7:4]&#xff0c;不能使用data[4:7]。 如下示例&#xff1a; module tb;reg […...

JVM考古现场(十三):混沌重启——从量子永生到宇宙热寂的终极编译

开篇&#xff1a;鸿蒙初判熵火燎原"诸君可曾窥见《诛仙剑阵》终章里那冻结的量子递归&#xff1f;当Project Omega的热寂算法冰封时空熵增&#xff0c;当意识编译器的玻尔兹曼大脑撕裂熵障&#xff0c;此刻我们将踏碎归墟晶壁&#xff0c;在第十三维度叩问&#xff1a;从代…...

CARLA常见技术问题集锦(一)地图与场景构建篇

编者荐语&#xff1a; 在自动驾驶技术加速落地的今天&#xff0c;CARLA 仿真引擎凭借其开源生态与高保真仿真能力&#xff0c;已成为全球开发者构建智能驾驶算法的核心工具之一。随着虚幻引擎 5.5 的全面升级&#xff0c;CARLA 0.10.0 版本实现了视觉革命&#xff1a;Lumen 全…...

视图、MySQL、触发器、存储过程、流程控制语句

DAY19.1 Java核心基础 MySQL 视图 数据库中的一张虚拟的表&#xff0c;允许不同用户和不同程序以不同的方式查询同一张表的数据 基于数据表&#xff0c;创建一个虚拟的表&#xff0c;然后可以选择需要展示的字段 为不同的用户创建不同的视图&#xff0c;一个视图包含薪资&…...

多层感知机(MLP)全面指南

多层感知机(MLP) 是一种人工神经网络,由多个神经元层组成。MLP中的神经元通常使用非线性激活函数,使得网络能够学习数据中的复杂模式。MLP 在机器学习中非常重要,因为它能够学习数据中的非线性关系,使其成为分类、回归和模式识别等任务中的强大模型。 神经网络基础 神经…...

【第13届蓝桥杯C/C++B组省赛】顺子日期

答案&#xff1a;14 1.数组办法解决 思路&#xff1a;前四个元素已经确定&#xff0c;分别枚举其他元素的合法性 #include <stdio.h> int main() {int a[8] {2,0,2,0,0,0,0,0};int month[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};int i,j;int count 0;for(i 1;…...

智慧医疗胃癌检测数据集VOC+YOLO格式487张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;487 标注数量(xml文件个数)&#xff1a;487 标注数量(txt文件个数)&#xff1a;487 标注…...

每日一题-力扣-2716: 最小化字符串长度 0328

LeetCode 2716: 最小化字符串长度问题剖析 题目解读 LeetCode 2716 是一道关于字符串操作的算法题。这道题乍看复杂&#xff0c;实则蕴含着优雅的数学规律。题目要求通过一系列特定的删除操作来最小化字符串的长度&#xff1a; 给定一个下标从 0 开始的字符串 s每次操作可以选…...

量子计算:开启未来计算的新纪元

一、引言 在当今数字化时代&#xff0c;计算技术的飞速发展深刻地改变了我们的生活和工作方式。从传统的电子计算机到如今的高性能超级计算机&#xff0c;人类在计算能力上取得了巨大的进步。然而&#xff0c;随着科技的不断推进&#xff0c;我们面临着越来越多的复杂问题&…...

安卓车载app面经

java部分 常见集合类 List 继承了Collection接口的一个接口&#xff0c;List中的数据是有序的&#xff0c;可重复的 实现类 在Java中&#xff0c;List 是一个接口&#xff0c;它属于 Java Collections Framework 的一部分。List 接口代表了一个有序的集合&#xff08;有时…...

JAVA SE :认识数组

目录 1.概念 2.数组的创建和初始化 2.1 创建 2.2 初始化 3.数组的使用 4.认识引用数据类型 4.1 JVM的内存分布 4.2 基本数据类型和引用数据类型 4.3 null的认识 5.二维数组 6.Arrays类的了解和使用 1.概念 数组用于存储一定数量相同类型的数据&#xff0c;可以看…...

深入理解机器学习之TF-IDF:文本特征提取的核心技术

文章目录 引言一、什么是TF-IDF&#xff1f;二、TF-IDF的数学原理1. 词频(TF)计算2. 逆文档频率(IDF)计算3. TF-IDF计算 三、TF-IDF的Python实现1.数据文件介绍2.导入库3.读取数据4.数据预处理5.对单词进行排序6.全部代码 四、结语 引言 在自然语言处理(NLP)和文本挖掘领域&am…...

Anaconda Jupyter 默认启动位置修改

Anaconda Jupyter 默认启动位置修改 本篇给大家分享的事关于Anaconda Jupyter的保存路径修改方法。 我们使用Anaconda Jupyter默认启动时&#xff0c;通常会跳转进入C盘的用户目录下&#xff0c;如下图所示。 但是很多时候我们使用 Jupyter 的场景并不在C盘&#xff0c;因为它…...

CNG汽车加气站操作工备考真题及答案解析【判断题】

1、燃气经营许可证按照燃气经营规模和类别实行分级审批。&#xff08;√&#xff09; 解析&#xff1a;不同规模和类别的燃气经营&#xff0c;其许可证审批级别不同&#xff0c;以确保经营活动的规范和安全。 2、依照《安全生产法》的规定&#xff0c;安全生产监督检查人员对检…...

es 3期 第27节-运用Script脚本实现复杂需求

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…...

智能监控视频聚合平台,GB28181/RTSP/SIP/RTMP直播会议融合方案

全场景智能监控聚合平台&#xff1a;打破边界&#xff0c;赋能高效协同 在数字化转型加速的今天&#xff0c;海量视频监控设备、多样化的编码协议与复杂的业务场景&#xff0c;让企业面临跨系统整合难、资源调度效率低、协作响应慢等痛点。我们的智能监控聚合平台以技术创新为…...

B494:开关电源领域的PWM控制新星

在电子技术飞速发展的今天&#xff0c;高效的电源管理系统成为各类电子设备稳定运行的关键。B494电压驱动型脉宽调制&#xff08;PWM&#xff09;控制集成电路以其卓越的性能和丰富的功能&#xff0c;成为开关电源设计领域的焦点。 一、B494&#xff1a;开关电源领域的PWM控制…...

03 相机标定图像采集

学完本文,您将获取一下技能: 1:如何提升标定质量,如选择标定板,标定图像采集的注意事项, 2:实现标定图像自动筛选的代码 3:量产场景如何通过一张图像来标定相机 为了实现良好的标定效果,以下因素在标定数据采集前必须设置得当。 标定板选择 标定板尺寸准确材料平…...

详解Spark executor

在 Apache Spark 中&#xff0c;Executor&#xff08;执行器&#xff09; 是运行在集群工作节点&#xff08;Worker Node&#xff09;上的进程&#xff0c;负责执行具体的计算任务并管理数据。它是 Spark 分布式计算的核心组件之一&#xff0c;直接决定了任务的并行度和资源利用…...

约束文件SDC常用命令

约束文件SDC常用命令 定义时钟create_clock -name CLK-period 2 [get_ports_clk]告诉工具主时钟周期是2ns(频率500MHz),从clk端口输入 输入信号延迟set_input_delay 0.5 -clock CLK [get_ports data_in]数据进芯片前,外部电路已消耗0.5ns,综合要预留这段“堵车时间”。 输出…...

流量分析2

一&#xff0c;webshell流量 [GKCTF 2021]签到 先看协议分级&#xff0c;大部分是tcp&#xff0c;里面有http的基于的行文本数据占了很大的比重&#xff0c;看看里面有什么 过滤http的流量 点击一条流量&#xff0c;里面的内容进去后面有基于行的文本数据&#xff0c; 先解he…...

23种设计模式-组合(Composite)设计模式

组合设计模式 &#x1f6a9;什么是组合设计模式&#xff1f;&#x1f6a9;组合设计模式的特点&#x1f6a9;组合设计模式的结构&#x1f6a9;组合设计模式的优缺点&#x1f6a9;组合设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是组合设计模式…...

数据库概述

文章目录 数据库1、什么是数据库&#xff1f;2、数据库的分类关系型数据库非关系型数据库优缺点 3、MySQL数据库的安装和使用3.1 卸载3.2 安装命令行操作 4、 Navicat For MySQL连接MySQL新建数据库新建表在表中添加数据执行SQL语句 数据库 1、什么是数据库&#xff1f; 数据…...

C# System.Text.Encoding 使用详解

总目录 前言 在C#编程中&#xff0c;处理字符串和字节数组之间的转换是一个常见的任务。System.Text.Encoding类及其派生类提供了丰富的功能&#xff0c;帮助开发者实现不同字符编码之间的转换。本文将详细讲解System.Text.Encoding类的使用方法&#xff0c;包括常用编码的介绍…...

js 对象深拷贝的五种方法

js 对象深拷贝 今天遇到一个bug &#xff0c;子组件页面修改了内容&#xff0c;但是按了取消保存按钮&#xff0c;没有将数据传回父组件的&#xff0c;但是父组件的数据改了&#xff0c;原因是通过子组件接受父组件的参数对象层级深没有做深拷贝的原因。 在 JavaScript 中&…...

1.1 计算机网络的概念

首先来看什么是计算机网络&#xff0c;关于计算机网络的定义并没有一个统一的标准&#xff0c;不同的教材有 不同的说法&#xff08;这是王道书对于计算机网络的定义&#xff09;&#xff0c;我们可以结合自己的生活经验去体会这个 定义。 可以用不同类型的设备去连接计算机网络…...

当EFISH-SBC-RK3576遇上区块链:物联网安全与可信数据网络‌

在工业物联网场景中&#xff0c;设备身份伪造与数据篡改是核心安全隐患。‌EFISH-SBC-RK3576‌ 通过 ‌硬件安全模块 区块链链上验证‌&#xff0c;实现设备身份可信锚定与数据全生命周期加密&#xff0c;安全性能提升10倍以上。 1. 安全架构&#xff1a;从芯片到链的端到端防…...

k8s 基础知识:Service + 负载均衡(下)

但凡觉得哪块说有问题&#xff0c;欢迎评论区留言探讨&#xff0c;谢谢 K8s Service 是 Kubernetes 集群中用于暴露应用程序的一种资源对象&#xff1a; 一、概念与作用&#xff1a; Service 可以将一组具有相同功能的 Pod&#xff08;容器组&#xff09;定义为一个逻辑分组…...

deepseek(2)——deepseek 关键技术

1 Multi-Head Latent Attention (MLA) MLA的核心在于通过低秩联合压缩来减少注意力键&#xff08;keys&#xff09;和值&#xff08;values&#xff09;在推理过程中的缓存&#xff0c;从而提高推理效率&#xff1a; c t K V W D K V h t c_t^{KV} W^{DKV}h_t ctKV​WDKVht​…...

机器学习之条件概率

1. 引言 概率模型在机器学习中广泛应用于数据分析、模式识别和推理任务。本文将调研几种重要的概率模型,包括EM算法、MCMC、朴素贝叶斯、贝叶斯网络、概率图模型(CRF、HMM)以及最大熵模型,介绍其基本原理、算法流程、应用场景及优势。 2. EM算法(Expectation-Maximizati…...

第四天 文件操作(文本/CSV/JSON) - 异常处理机制 - 练习:日志文件分析器

Python文件操作与异常处理完全指南&#xff1a;从入门到实战 一、为什么要学习文件操作和异常处理&#xff1f; 在Python编程的初级阶段&#xff0c;我们主要处理内存中的数据。但当我们需要&#xff1a; 永久保存数据处理各种格式的数据文件分析系统日志构建数据处理管道 …...

多onnx模型导出合并调研(文本检测+方向分类+文本识别)

👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… ​💫签名:面朝大海,春暖花开! 多onnx模型合并导出调研(文本检测+方向分类+文本识别) 引言1,尝试合并两个模型(文本方向分类+文本识别模型)(并行合并)(1)文本方向分类(2)文本识别模型(…...

linux scp复制多层级文件夹到另一服务器免密及脚本配置

文章目录 生成 SSH 密钥对将公钥复制到目标服务器验证免密登录scp 多级文件夹复制脚本 生成 SSH 密钥对 在本地机器上&#xff0c;使用 ssh-keygen 命令生成 SSH 密钥对。打开终端并执行以下命令&#xff1a; ssh-keygen -t rsa 按提示连续按回车键&#xff0c;默认会在 ~/.ss…...

Ubuntu 22.04 安装向日葵远程控制

1. 前言 由于公司客户的服务器用是图形化桌面&#xff0c;所以我们需要一个远程控制工具来控制服务器&#xff0c;目前市面上两款比较热门的控制软件就是ToDesk和向日葵了&#xff0c;我们今天就来学习一下向日葵的使用 2. 下载软件 前往向日葵官网下载 向日葵远程控制app官…...

Spring Boot(十七):集成和使用Redis

Redis(Remote Dictionary Server,远程字典服务器)是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Spring Boot 中集成和使用Redis主要涉及以下几个步骤: 添加依赖 在项目的pom.xml文件中添加Redis的依赖。Spring Boot提供了对Redis的集…...

Redisson - 分布式锁和同步器

文章目录 锁&#xff08;Lock&#xff09;公平锁&#xff08;Fair Lock&#xff09;联锁&#xff08;MultiLock&#xff09;红锁&#xff08;RedLock&#xff09; 【已废弃】读写锁&#xff08;ReadWriteLock&#xff09;信号量&#xff08;Semaphore&#xff09;可过期许可信号…...

LabVIEW时间触发协议

介绍了基于LabVIEW开发的时间触发协议应用&#xff0c;通过实例解析了FlexRay总线的设计与优化。通过技术细节、系统构建和功能实现等方面&#xff0c;探讨了LabVIEW在现代工业通信系统中的应用效能&#xff0c;特别是在提高通信可靠性和实时性方面的贡献。 ​ 项目背景 在工…...

IDEA的使用

idea的介绍 IntelliJ IDEA 是由 JetBrains 公司开发的一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Java语言的开发&#xff0c;但同时也支持其他多种编程语言如Kotlin、Groovy、Scala等。它被广泛认为是专业软件开发者的首选工具之一&#xff…...

unity一个图片的物体,会有透明的效果

如图 想要去掉这个透明效果 选择一个高层级的layer即可。...

IP报文格式

IPv4 头部结构&#xff08;共 20 字节&#xff0c;不含可选字段&#xff09; 1. 版本&#xff08;Version&#xff09; 长度&#xff1a;4 比特 作用&#xff1a;标识 IP 协议版本&#xff08;IPv4 值为 4&#xff0c;IPv6 值为 6&#xff09;。 示例&#xff1a;0100&#x…...