【java】接口幂等性的实现
文章目录
- 1. 引言
- 介绍幂等性的概念
- 为什么需要在Java接口中实现幂等性
- 2. 使用幂等表实现幂等性
- 什么是幂等表
- 如何设计幂等表
- 示例:Java代码实现使用幂等表
- 使用幂等表实现幂等性
- 3. 利用Nginx + Lua 和 Redis实现幂等性
- Nginx和Lua的作用简介
- 介绍Redis的SETNX命令
- 架构设计:如何结合Nginx、Lua和Redis实现幂等性
- 示例:配置Nginx和Lua脚本,以及相应的Java调用代码
- 利用Nginx + Lua 和 Redis实现幂等性
- 4. 利用AOP实现幂等性
- 介绍AOP(面向切面编程)的基本概念
- 使用Spring AOP实现幂等性的策略
- 示例:定义切面,编写After通知更新Redis状态
- 定义切面
- 利用AOP实现幂等性
- 5. 实战应用和测试
- 提供测试示例和结果
1. 引言
介绍幂等性的概念
在计算机科学中,幂等性是一种重要的属性,它指的是一个操作被执行多次和执行一次具有相同的效果。换句话说,无论这个操作进行多少次,结果都应该是一致的。这个概念在多种编程场景中都非常重要,尤其是在分布式系统、网络通信和数据库操作中。注意幂等性和防重的本质区别是,防重是多次请求返回报错,而幂等是返回一样的结果
例如,考虑一个简单的HTTP GET请求,它应该是幂等的,这意味着无论你请求多少次,服务器返回的结果都应该是相同的,不会因为多次请求而改变服务器的状态。相对地,一个POST请求在传统上不是幂等的,因为它可能会每次请求都创建一个新的资源。
为什么需要在Java接口中实现幂等性
在Java应用开发中,尤其是涉及到网络通信和数据库操作的应用,实现接口的幂等性变得尤为重要。这主要是因为:
- 防止数据重复:在网络不稳定或用户重复操作的情况下,确保数据不会被重复处理,例如,避免因为用户点击了多次“支付”按钮而多次扣款。
- 提高系统的健壮性:系统能够处理重复的请求而不会出错或产生不一致的结果,增强了系统对外界操作的容错能力。
- 简化错误恢复:当操作失败或系统异常时,可以安全地重新执行操作,而不需要担心会引起状态的错误或数据的不一致。
- 增强用户体验:用户不需要担心多次点击或操作会导致不期望的结果,从而提升用户的操作体验。
2. 使用幂等表实现幂等性
- 实现流程
- 在数据库设计阶段,加入幂等表。
- 在业务逻辑开始前,检查幂等表中是否已有相应的请求记录。
- 根据检查结果决定是否继续处理请求。
- 处理完成后更新幂等表的状态。
什么是幂等表
幂等表是一种在数据库中用于跟踪已经执行过的操作的机制,以确保即使在多次接收到相同请求的情况下,操作也只会被执行一次。这种表通常包含足够的信息来识别请求和其执行状态,是实现接口幂等性的一种有效手段。
如何设计幂等表
设计幂等表时,关键是确定哪些字段是必需的,以便能够唯一标识每个操作。一个基本的幂等表设计可能包括以下字段:
- ID:一个唯一标识符,通常是主键。
- RequestID:请求标识符,用于识别来自客户端的特定请求,这里最好加上唯一键索引。
- Status:表示请求处理状态(如处理中、成功、失败)。
- Timestamp:记录操作的时间戳。
- Payload(可选):存储请求的部分或全部数据,用于后续处理或审计。
示例:Java代码实现使用幂等表
以下是一个简单的Java示例,展示如何使用幂等表来确保接口的幂等性。假设我们使用Spring框架和JPA来操作数据库。
首先,定义一个幂等性实体:
import javax.persistence.*;
import java.time.LocalDateTime;@Entity
@Table(name = "idempotency_control")
public class IdempotencyControl {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false, unique = true)private String requestId;@Column(nullable = false)private String status;@Column(nullable = false)private LocalDateTime timestamp;// Constructors, getters and setters
}
接下来,创建一个用于操作幂等表的Repository:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;@Repository
public interface IdempotencyControlRepository extends JpaRepository<IdempotencyControl, Long> {IdempotencyControl findByRequestId(String requestId);
}
最后,实现一个服务来处理请求,使用幂等表确保操作的幂等性:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class IdempotencyService {@Autowiredprivate IdempotencyControlRepository repository;@Transactionalpublic String processRequest(String requestId, String payload) {IdempotencyControl control = repository.findByRequestId(requestId);if (control != null) {return "Request already processed"; // 通过control表结果确定返回的内容}control = new IdempotencyControl();control.setRequestId(requestId);control.setStatus("PROCESSING");control.setTimestamp(LocalDateTime.now());repository.save(control);// Process the request here// Assume processing is successfulcontrol.setStatus("COMPLETED");repository.save(control);return "Request processed successfully";}
}
在这个示例中,我们首先检查请求ID是否已存在于数据库中。如果存在,我们认为请求已经处理过,直接返回相应信息
。如果不存在,我们将其状态标记为处理中,处理请求,然后更新状态为完成。这种方法确保了即使在多次接收到相同的请求时,操作的效果也是一致的。
使用幂等表实现幂等性
关键代码:
public boolean checkAndInsertIdempotentKey(String requestId) {String sql = "INSERT INTO idempotency_keys (request_id, status, created_at) VALUES (?, 'PENDING', NOW()) ON DUPLICATE KEY UPDATE request_id=request_id";try {int result = jdbcTemplate.update(sql, requestId);return result == 1;} catch (DuplicateKeyException e) {return false;}
}
技术解析:
- 这段代码尝试将一个新的请求ID插入到幂等表中。如果请求ID已存在,
ON DUPLICATE KEY UPDATE
子句将被触发,但不会更改任何记录,返回的结果将是0。 - 使用
jdbcTemplate
来处理数据库操作,这是Spring框架提供的一个便利工具,可以简化JDBC操作。 - 通过捕获
DuplicateKeyException
,我们可以确定请求ID已存在,从而阻止重复处理。
重要决策和选择:
- 选择
ON DUPLICATE KEY UPDATE
是为了确保操作的原子性,避免在检查键是否存在和插入键之间进行额外的数据库查询,这样可以减少竞争条件的风险。
3. 利用Nginx + Lua 和 Redis实现幂等性
- 实现流程
- 在Nginx服务器上配置Lua模块。
- 编写Lua脚本,利用Redis的SETNX命令检查和设置请求标志。
- 根据Lua脚本的执行结果在Nginx层面拦截重复请求或放行。
Nginx和Lua的作用简介
Nginx 是一个高性能的HTTP和反向代理服务器,它也常用于负载均衡。Nginx通过其轻量级和高扩展性,能够处理大量的并发连接,这使得它成为现代高负载应用的理想选择。
Lua 是一种轻量级的脚本语言,它可以通过Nginx的模块 ngx_lua 嵌入到Nginx中,从而允许开发者在Nginx配置中直接编写动态逻辑。这种结合可以极大地提高Nginx的灵活性和动态处理能力,特别是在处理HTTP请求前的预处理阶段。
介绍Redis的SETNX命令
SETNX 是Redis中的一个命令,用于“SET if Not eXists”。其基本功能是:只有当指定的键不存在时,才会设置键的值。这个命令常被用于实现锁或其他同步机制,非常适合用来保证操作的幂等性。
- 如果SETNX成功(即之前键不存在),则意味着当前操作是第一次执行;
- 如果SETNX失败(键已存在),则意味着操作已经被执行过。
架构设计:如何结合Nginx、Lua和Redis实现幂等性
在一个典型的架构中,客户端发起的请求首先到达Nginx服务器。Nginx使用Lua脚本预处理这些请求,Lua脚本会检查Redis中相应的键是否存在:
- 接收请求:Nginx接收到客户端的请求。
- Lua脚本处理:Nginx调用Lua脚本,Lua脚本尝试在Redis中使用SETNX设置一个与请求相关的唯一键。
- 检查结果:
- 如果键不存在,Lua脚本设置键并继续处理请求(转发到后端Java应用);
- 如果键存在,Lua脚本直接返回一个错误或提示消息,告知操作已执行,防止重复处理。
示例:配置Nginx和Lua脚本,以及相应的Java调用代码
Nginx配置部分:
http {lua_shared_dict locks 10m; # 分配10MB内存用于存储锁信息server {location /api {default_type 'text/plain';content_by_lua_block {local redis = require "resty.redis"local red = redis:new()red:set_timeout(1000) -- 1秒超时local ok, err = red:connect("127.0.0.1", 6379)if not ok thenngx.say("Failed to connect to Redis: ", err)returnendlocal key = "unique_key_" .. ngx.var.request_urilocal res, err = red:setnx(key, ngx.var.remote_addr)if res == 0 thenngx.say("Duplicate request")returnend-- 设置键的过期时间,防止永久占用red:expire(key, 60) -- 60秒后自动删除键-- 转发请求到后端应用ngx.exec("@backend")}}location @backend {proxy_pass http://backend_servers;}}
}
Java调用代码:
Java端不需要特殊处理,因为幂等性的控制已经在Nginx+Lua层面实现了。Java应用只需按照正常逻辑处理从Nginx转发过来的请求即可。
@RestController
@RequestMapping("/api")
public class ApiController {@PostMapping("/process")public ResponseEntity<String> processRequest(@RequestBody SomeData data) {// 处理请求return ResponseEntity.ok("Processed successfully");}
}
这种方式将请求的幂等性管理从应用层移至更靠前的网络层,有助于减轻后端应用的负担,并提升整体的响应速度和系统的可扩展性。
利用Nginx + Lua 和 Redis实现幂等性
关键配置和代码:
location /api {set_by_lua $token 'return ngx.var.arg_token';access_by_lua 'local res = ngx.location.capture("/redis", { args = { key = ngx.var.token, value = "EXISTS" } })if res.body == "EXISTS" thenngx.exit(ngx.HTTP_FORBIDDEN)end';proxy_pass http://my_backend;
}
技术解析:
- 使用
set_by_lua
从请求中提取token,并在Lua脚本中使用该token。 access_by_lua
块中,通过访问内部位置/redis
来查询Redis中的键值。如果键已存在,返回403禁止访问状态码,防止进一步处理请求。proxy_pass
将请求转发到后端服务。
重要决策和选择:
- 使用Nginx和Lua的组合允许在请求达到应用服务器之前进行预处理,减轻后端的负担。
- 通过Redis进行快速键值检查,利用其性能优势确保操作的速度和效率。
4. 利用AOP实现幂等性
- 实现流程
- 定义一个切面,专门处理幂等性逻辑。
- 在适当的切入点(如服务层方法)使用前置通知进行幂等检查。
- 根据业务需求,可能还需要在方法执行后通过后置通知更新状态。
介绍AOP(面向切面编程)的基本概念
面向切面编程(AOP) 是一种编程范式,旨在通过将应用程序逻辑从系统服务中分离出来来增强模块化。这种方法主要用于处理横切关注点,如日志记录、事务管理、数据验证等,这些通常会分散在多个模块或组件中。AOP通过定义切面(aspects),使得这些关注点的实现可以集中管理和复用。
在Java中,Spring框架通过Spring AOP提供了面向切面编程的支持,允许开发者通过简单的注解或XML配置来定义切面、切点(pointcuts)和通知(advices)。
使用Spring AOP实现幂等性的策略
在实现接口幂等性的上下文中,可以使用Spring AOP来拦截接口调用,并进行必要的幂等检查。这通常涉及以下步骤:
- 定义切点:指定哪些方法需要幂等性保护。
- 前置通知:在方法执行前,检查某个标识符(如请求ID)是否已存在于Redis中,如果存在,则阻止方法执行。
- 后置通知:在方法执行后,将请求ID添加到Redis中,以标记此操作已完成。
示例:定义切面,编写After通知更新Redis状态
以下是一个使用Spring AOP来实现幂等性的示例,包括定义切面和编写后置通知来更新Redis状态。
定义切面
首先,需要定义一个切面和一个切点,这个切点匹配所有需要幂等性保护的方法:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.AfterReturning;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.data.redis.core.StringRedisTemplate;@Aspect
@Component
public class IdempotenceAspect {@Autowiredprivate StringRedisTemplate redisTemplate;@Pointcut("@annotation(Idempotent)") // 假设Idempotent是一个自定义注解,用于标记需要幂等保护的方法public void idempotentOperation() {}@AfterReturning("idempotentOperation()")public void afterReturning(JoinPoint joinPoint) {// 获取请求标识String key = extractKeyFromJoinPoint(joinPoint);// 将操作标识存入Redis中,标记为已处理redisTemplate.opsForValue().set(key, "processed", 10, TimeUnit.MINUTES); // 示例中设置10分钟后过期}private String extractKeyFromJoinPoint(JoinPoint joinPoint) {// 此处实现从方法参数等获取key的逻辑return "SOME_KEY";}
}
在这个例子中,Idempotent
注解用于标记那些需要幂等性保护的方法。@AfterReturning
通知确保只有在方法成功执行后,请求标识才会被添加到Redis中。这样可以防止在执行过程中发生异常时错误地标记请求为已处理。
这种方法的优点是它将幂等性逻辑与业务代码解耦,使得业务逻辑更加清晰,同时集中管理幂等性保护。
利用AOP实现幂等性
关键代码:
@Aspect
@Component
public class IdempotencyAspect {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@AfterReturning(pointcut = "execution(* com.example.service.*.*(..)) && @annotation(Idempotent)", returning = "result")public void afterReturningAdvice(JoinPoint joinPoint, Object result) {String key = getKeyFromJoinPoint(joinPoint);redisTemplate.opsForValue().set(key, "COMPLETED", 10, TimeUnit.MINUTES);}private String getKeyFromJoinPoint(JoinPoint joinPoint) {// Logic to extract key based on method arguments or annotations}
}
技术解析:
- 定义了一个切面
IdempotencyAspect
,它在带有@Idempotent
注解的方法执行成功后运行。 - 使用
@AfterReturning
通知来更新Redis中的键状态,标记为“COMPLETED”。
重要决策和选择:
- 选择AOP允许开发者不侵入业务代码地实现幂等性,提高代码的可维护性和清晰性。
- 使用Redis来存储操作状态,利用其快速访问和过期机制来自动管理状态数据。
这些解析和决策展示了如何在不同层面上通过技术手段确保Java接口的幂等性,每种方法都有其适用场景和优势。
5. 实战应用和测试
提供测试示例和结果
测试幂等表
- 场景:模拟用户重复提交订单请求。
- 操作:连续发送相同的订单创建请求。
- 预期结果:第一次请求创建订单成功,后续请求被拦截,返回提示信息如“操作已处理”。
测试代码示例:
// 假设有一个订单提交的接口
@PostMapping("/submitOrder")
public ResponseEntity<String> submitOrder(@RequestBody Order order) {boolean isProcessed = idempotencyService.checkAndRecord(order.getId());if (!isProcessed) {return ResponseEntity.ok("订单已成功提交");} else {return ResponseEntity.status(HttpStatus.CONFLICT).body("操作已处理");}
}
测试Nginx + Lua + Redis
- 场景:用户在短时间内多次点击支付按钮。
- 操作:模拟快速连续发送支付请求。
- 预期结果:第一次请求处理支付,后续请求在Nginx层面被拦截,返回错误或提示信息。
测试Spring AOP
- 场景:调用API接口进行资源创建。
- 操作:连续调用同一API接口。
- 预期结果:通过AOP切面的前置通知,第一次调用执行资源创建,后续调用返回已处理的状态。
测试代码示例:
// AOP切面处理
@Aspect
@Component
public class IdempotencyAspect {@Autowiredprivate IdempotencyService idempotencyService;@Before("@annotation(Idempotent) && args(request,..)")public void checkIdempotency(JoinPoint joinPoint, IdempotentRequest request) throws Throwable {if (!idempotencyService.isRequestUnique(request.getRequestId())) {throw new IdempotencyException("Duplicate request detected.");}}
}
测试结果应该显示幂等性逻辑有效阻止了重复操作,从而确保了系统的稳定性和数据的一致性。这些测试不仅验证了功能的正确性,还可以在系统压力测试中评估幂等性解决方案的性能影响。
相关文章:
【java】接口幂等性的实现
文章目录 1. 引言介绍幂等性的概念为什么需要在Java接口中实现幂等性 2. 使用幂等表实现幂等性什么是幂等表如何设计幂等表示例:Java代码实现使用幂等表使用幂等表实现幂等性 3. 利用Nginx Lua 和 Redis实现幂等性Nginx和Lua的作用简介介绍Redis的SETNX命令架构设计…...
Leetcode 1.两数之和
题目意在对数组的快速查找 思路:哈希表 先创建一个哈希表,然后对数组进行遍历,iter代表用目标值依次减去遍历数组中的元素后得出的值,如果这个值在map中存在,则返回其索引和当前数组元素中的索引;若不存…...
GitLab指定用户分配合并权限
进入项目 -》 Project Settings Repository -》展开 Protected branches -》 添加要保护的分支,设置角色 管理用户角色权限 查看到不同用户的角色,一般设置Developer只有Merger Request权限,Maintainer还有Merge审批权限 GitLab 中的权限…...
实战优化公司线上系统JVM:从基础到高级
引言 Java虚拟机(JVM)是Java语言的核心组件,它使得Java程序能够实现“一次编写,到处运行”的跨平台特性。在现代应用程序中,JVM的性能和稳定性直接影响到系统的整体表现。本文将深入探讨JVM的基础知识、基本特点、定义…...
实时数据开发 | 一文理解Flink窗口机制
窗口操作在流处理和批处理之间起到了桥梁的作用。 Flink引擎本质上是流式引擎,认为批处理是流处理的一个特例。因此,通过窗口将流数据划分为有限大小的集合,使得在这些有界的数据集上可以进行批处理风格的计算。 通过配置窗口的参数…...
【云原生系列】迁移云上需要考虑哪些问题
云计算已经成为现代企业架构中不可或缺的一部分。越来越多的公司正在将他们的应用、数据和基础设施迁移到云平台上,以便更好地应对快速变化的市场需求、提高运营效率并降低成本。然而,迁移到云端并不是一件轻松的事情。涉及到多个技术、业务和管理层面的…...
1、Three.js开端准备环境
准备工作 从 CDN 导入 1.安装 VSCode 2.安装 Node.js 3.查看Three.js最新版本 4.如何cdn引入: https://cdn.jsdelivr.net/npm/threev版本号/build/three.module.js 例如:https://cdn.jsdelivr.net/npm/threev0.170.0/build/three.module.js 我们需要…...
go 和java 编写方式的理解
1. go 推荐写流水账式的代码(非贬义),自己管自己。java喜欢封装各种接口供外部调用,让别人来管自己。 2. 因为协程的存在, go的变量作用域聚集在方法内部,即函数不可重入,而java线程的限制&…...
华为ENSP--BGP路由协议实验详解
项目背景 随着A公司网络规模的增长和新业务对互联网接入速度及稳定性需求的提升,公司决定升级其网络设施。为此,A公司向运营商B租用了两条线路以接入网络,旨在提高网络资源的利用率,并增强网络的安全性、稳定性和可靠性,从而为用户提供更优质的服务和体验 在这一背景下,正…...
LLM*:路径规划的大型语言模型增强增量启发式搜索
路径规划是机器人技术和自主导航中的一个基本科学问题,需要从起点到目的地推导出有效的路线,同时避开障碍物。A* 及其变体等传统算法能够确保路径有效性,但随着状态空间的增长,计算和内存效率会严重降低。相反,大型语言…...
UE5 MakeSlateBrush 节点的作用
在 Unreal Engine 5 (UE5) 中,MakeSlateBrush 节点是用于 创建或设置一个 Slate Brush 的节点。Slate 是 Unreal Engine 中的 UI 框架,用于构建编辑器界面以及游戏中的用户界面(UI)。Slate Brush 是 Slate UI 中的一种资源类型&am…...
机载视频流回传+编解码方案
无线网络,低带宽场景。不能直接转发ROS raw image(10MB/s),而要压缩(编码)后再传输。可以用rtsp的udp传输或者直接传输话题,压缩方法有theora(ROS image_transport默认支持ÿ…...
小程序 - 婚礼邀请函
小程序页面和样式练习 - 婚礼邀请函小程序开发笔记 目录 婚礼邀请函 准备工作 加载静态资源 项目初始化 标签栏的配置 各页面导航栏标题配置 全局导航栏样式配置 公共样式的编写 项目内容 邀请函页面内容 邀请函页面样式 照片页面内容 照片墙页面样式 美好时光页…...
命令行使用ssh隧道连接远程mysql
本地电脑A 跳板机B 主机2.2.2.2 用户名 B ssh端口号22 登录密码bbb 远程mysql C 地址 3.3.3.3 端口号3306 用户名C 密码ccc A需要通过跳板机B才能访问C; navicat中配置ssh可以实现在A电脑上访问C 如何实现本地代码中访问C呢? # 假设本地使…...
深度学习:完整的模型训练流程
深度学习:完整的模型训练流程 为了确保我们提供一个彻底和清晰的指导,让我们深入分析在model.py和train.py文件中定义的模型训练和验证流程。以下部分将详细讨论模型结构的定义、数据的加载与预处理、训练参数的配置、训练与测试循环,以及模…...
【数据结构】ArrayList与顺序表
ArrayList与顺序表 1.线性表2.顺序表2.1 接口的实现 3. ArrayList简介4. ArrayList使用4.2 ArrayList常见操作4.3 ArrayList的遍历4.4 ArrayList的扩容机制 5. ArrayList的具体使用5.1 杨辉三角5.2 简单的洗牌算法 6. ArrayList的问题及思考 【本节目标】 线性表顺序表ArrayLis…...
如何使用 python 中 pandas 进行数据分析?
使用Python中的pandas进行数据分析主要有以下几个步骤: 导入pandas库和数据文件 首先需要导入pandas库和数据文件,可以使用pandas的read_csv()函数读取CSV格式的数据文件,并将其存储为DataFrame格式。 pythonCopy code import pandas as p…...
WordPress文章目录插件,LuckyWP Table of Contents自动生成文章插件
文章带目录不能帮助用户快速获取信息,也能让页面内容更具条例,更加符合搜索引擎收录规范。今天给大家推荐一款免费好用的WordPress文章目录插件LuckyWP Table of Contents。LuckyWP Table of Contents 是一个WordPress插件,它允许你在博客帖…...
Qwen2.5-7B大模型微调记录
Qwen2.5-7B大模型微调记录 研究需要,需要搞一个大模型出来,没有太多的时间自己训练,准备用现成的开源大模型,然后结合研究方向进行微调 前前后后折腾大半个月,总算做完了第一个微调的大模型,模型基于阿里…...
TCP三次握手和四次挥手
三次握手:表示这客户与服务器之间的连接确定。 第一次:由客户端发出连接请求到服务器,服务器收到后可以确定客户的发送与自身的接收没问题 第二次:再由服务器回话个客户,让客户知道自己的发送与接收没问题,这时服务器还不知自己的…...
[Maven]3.5.3配置
MAVEN本地仓库配置: 1.conf 2.settings.xml 3.找到本地仓库配置目录 4.填写路径 5.镜像仓库...
68000汇编实战01-编程基础
文章目录 简介产生背景应用领域 语言学习EASy68K帮助文档IDE使用 编程语言commentslabels开始标签指令标签位置标签 opcode 操作码常用操作码数据传送算术运算逻辑运算控制流分支跳转地址跳转子程序跳转 位操作比较堆栈操作 IO操作码其他操作码 directives 指令DC指令EQU 指令S…...
常见的概念 及 分布式系统的演变过程
文章目录 一. 概念解释1. 应用(Application)/ 系统(System)2. 模块(Module)/ 组件(Component)3. 分布式(Distributed)4. 集群(Cluster)…...
torch.is_nonzero(input)
torch.is_nonzero(input) input: 输入张量 若输入是 不等于零的单元素张量 则返回True,否则返回False 不等于零的单元素张量:torch.tensor([0.]) 或 torch.tensor([0]) 或 torch.tensor([False])单元素张量: 只有一个数 的张量 import torch print(t…...
爬虫开发(5)如何写一个CSDN热门榜爬虫小程序
笔者 綦枫Maple 的其他作品,欢迎点击查阅哦~: 📚Jmeter性能测试大全:Jmeter性能测试大全系列教程!持续更新中! 📚UI自动化测试系列: SeleniumJava自动化测试系列教程❤ 📚…...
Rust 组织管理
Rust 组织管理 Rust 是一种系统编程语言,以其安全性、并发性和性能而闻名。随着 Rust 社区的不断壮大,有效的组织管理变得至关重要。本文将探讨 Rust 社区的组织结构、项目管理、社区参与和未来发展方向。 Rust 社区的组织结构 Rust 社区采用了一种去中心化的组织结构。核…...
谈谈微服务的常用组件
由于微服务给系统开发带来了一些问题和挑战,如服务调用的复杂性、分布式事务的处理、服务的动态管理等,为了更好地解决这些问题和挑战,各种微服务治理的组件应运而生,充当微服务架构的基石和支撑,常用组件如下表&#…...
Android11.0默认壁纸缩放
获取壁纸缩放值的代码 //in com.android.server.wm.WallpaperController private final float mMaxWallpaperScale; //construct method WallpaperController(WindowManagerService service, DisplayContent displayContent) {......mMaxWallpaperScale service.mContext.ge…...
git 本地同步远端分支
一、关联远程仓库 本地仓库关联远端仓库 git remote add origin https://github.com/user/repository.git 二、获取远程分支信息 获取远程仓库的最新分支信息 git fetch origin 三、创建或切换到本地分支以跟踪远程分支 1. 创建分支 创建分支并关联到远端分支 git bra…...
数字IC后端设计实现之分段长clock tree经典案例
最近发现很多读者问到分段长clock tree的做法,小编今天给大家分享几个SoC芯片中复杂时钟结构设计的分段长clock tree的应用案例。希望对各位的学习和工作有所助益。 数字后端设计实现之时钟树综合实践篇 数字IC后端实现专家都具备哪些技能?(…...
矩阵重新排列——rot90函数
通过 r o t 90 rot90 rot90函数可以将矩阵进行旋转 用法: r o t 90 ( a , k ) rot90(a,k) rot90(a,k)将矩阵 a a a按逆时针方向旋转 k 9 0 ∘ k\times90^\circ k90∘...
深入解析音视频流媒体SIP协议交互过程
一、引言 在音视频流媒体传输过程中,SIP(Session Initiation Protocol)协议发挥着举足轻重的作用。本文将详细全面地介绍音视频流媒体传输中的SIP协议,包括其基本概念、交互过程、关键信令以及应用场景 二、SIP协议基本概念 1.…...
【C++】深入解析 cin 和 cout:理解区分输入输出流运算符
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯cin 和 cout 简介💯cin >> 与 cout << 的流运算符💯理解流运算符方向的四种方法1. 符号方向对应数据流动的方向2. 形象比喻3. 记住公式…...
java介绍
Java是一种广泛应用的高级编程语言,具有以下特点和应用场景: 语言特性 简单易学 Java语法相对简洁,去除了一些复杂的指针操作等,使得程序员能够更专注于业务逻辑的实现。例如,Java使用自动内存管理(垃圾回…...
1-深度学习干货总结(持续更新)
机器学习核心组件 可以用来学习的数据(data); 如何转换数据的模型(model); 一个目标函数(objective function),用来量化模型的有效性; 调整模型参数以优化…...
《C++搭建神经网络基石:开启智能编程新征程》
在人工智能的璀璨星空中,神经网络无疑是最为耀眼的星座之一。而 C以其卓越的性能和高效的执行效率,成为构建神经网络模型的有力武器。今天,就让我们一同探索如何使用 C构建一个基础的神经网络模型,踏上智能编程的奇妙旅程。 一、…...
小程序 - 本地生活
小程序页面和样式练习 - 本地生活小程序开发笔记 目录 本地生活 准备工作 加载图片素材 页面开发 页面样式开发 功能实现截图 总结 本地生活 本地生活”微信小程序是一个介绍本地美食、装修、工作等信息的微信小程序,该微信小程序的首页包含轮播图区域和九宫…...
docker的joinsunsoft/docker.ui修改密码【未解决】
docker的joinsunsoft/docker.ui修改密码 前言 这个挺遗憾的,个人能力不足。想修改密码是不可能了。 因为,系统的密码加密规则不知道。 目前了解到的内容是: 地址是:https://hub.docker.com/r/joinsunsoft/docker.ui服务是用go语…...
pyspark实现基于协同过滤的电影推荐系统
最近在学一门大数据的课,课程要求很开放,任意做一个大数据相关的项目即可,不知道为什么我就想到推荐算法,一直到着手要做之前还没有新的更好的来代替,那就这个吧。 推荐算法 推荐算法的发展由来已久,但和…...
【VRChat 全身动捕】VIVE 手柄改 tracker 定位器教程,低成本光学动捕解决方案(持续更新中2024.11.26)
更新 0.0.1(2024/11/26): 1.解决了内建蓝牙无法识别、“steamVR 蓝牙不可用” 的解决方案 2.解决了 tracker 虽然建立了连接但是在 steamVR 界面上看不到的问题 3.解决了 VIVE 基站1.0 无法被蓝牙识别 && 无法被 steamVR 搜索到 &…...
C++11
C11 C11简介一.列表初始化{ }initializer_list 二.一些关键字三.右值引用和移动语义(重要)完美转发移动构造和移动赋值重载 四.小知识类成员变量初始化 五.可变参数模板六.lambda表达式(又称匿名函数)(重要)…...
MySQL - 表的增删查改
文章目录 1.新增1.1语法1.2单行插入1.3多行插入1.4插入后更新1.5替换 2.查找2.1语法2.2使用 3.修改3.1语法3.2使用 4.删除4.1语法4.2使用4.3截断表 5.插入查询结果5.1语法5.2使用 1.新增 1.1语法 INSERT [INTO] table_name [(column1, column2, ...)] VALUES (value1, value2…...
Vue3 调用子组件的方法和变量
1. 通过 ref 调用子组件的方法和变量 Vue 3 引入了 ref,你可以通过 ref 获取子组件实例,并调用其方法或访问其数据。 例子 子组件 (Child.vue) <template><div><p>{{ message }}</p><button click"updateMessage&qu…...
蓝桥杯嵌入式再学习(4)led的点亮
led的点亮的话先在cubemx里点一下配置 以下是对应的代码...
CentOS7安装nvm
CentOS7安装nvm 在 CentOS 7 上安装 NVM(Node Version Manager)可以通过以下步骤进行。NVM 是一个用于管理多个 Node.js 版本的工具,允许你在不同的项目中使用不同的 Node.js 版本。 步骤 1:更新系统 首先,确保你的…...
2024年工信部大数据分析师证书报考条件是怎样的?有什么用
大数据分析师,乃是这样一类专业人才,他们凭借着先进且高效的数据分析技术以及各类实用工具,对规模庞大、纷繁复杂的海量数据展开全面而细致的清洗、处理、分析以及解读工作。其工作的核心目标在于为企业的决策制定提供有力依据,推…...
天锐绿盾加密软件与Ping32联合打造企业级安全保护系统,确保敏感数据防泄密与加密管理
随着信息技术的飞速发展,企业在日常经营过程中产生和处理的大量敏感数据,面临着越来越复杂的安全威胁。尤其是在金融、医疗、法律等领域,数据泄漏不仅会造成企业巨大的经济损失,还可能破坏企业的信誉和客户信任。因此,…...
代码随想录算法训练营第六十天|Day60 图论
Bellman_ford 队列优化算法(又名SPFA) https://www.programmercarl.com/kamacoder/0094.%E5%9F%8E%E5%B8%82%E9%97%B4%E8%B4%A7%E7%89%A9%E8%BF%90%E8%BE%93I-SPFA.html 本题我们来系统讲解 Bellman_ford 队列优化算法 ,也叫SPFA算法…...
Web登录页面设计
记录第一个前端界面,暑假期间写的,用了Lottie动画和canvas标签做动画,登录和注册也连接了数据库。 图片是从网上找的,如有侵权私信我删除,谢谢啦~...
Rust标准库中集合类型用法详解
文章目录 Vec<T> 动态数组创建动态数组增加删除元素访问元素遍历Vec控制容量修改元素元素排序 HashMap<K, V>哈希表创建 HashMap插入和更新元素访问元素删除元素遍历HashMap使用默认值 HashSet<T>哈希集合创建 HashSet插入和删除元素查找元素遍历HashSet使用…...