Spring Boot牵手Redisson:分布式锁实战秘籍
一、引言
在当今的分布式系统架构中,随着业务规模的不断扩大和系统复杂度的日益增加,如何确保多个服务节点之间的数据一致性和操作的原子性成为了一个至关重要的问题。在单机环境下,我们可以轻松地使用线程锁或进程锁来控制对共享资源的访问,但在分布式系统中,由于各个服务节点分布在不同的物理或逻辑位置,它们之间的内存并不共享,传统的锁机制无法直接应用。这时候,分布式锁应运而生。
分布式锁作为一种跨节点的同步机制,能够有效地控制多个进程或线程对共享资源的访问,确保在同一时刻只有一个客户端能够获取到锁并执行临界区代码,从而避免数据不一致和竞态条件等问题。它在许多场景中都发挥着关键作用,比如电商系统中的库存扣减、订单处理,分布式任务调度系统中的任务分配与执行,以及缓存数据的更新等。
在众多分布式锁的实现方案中,基于 Redis 的方案因其高性能、简单易用等特点而被广泛采用。而 Redisson 作为一个在 Redis 基础上实现的 Java 驻内存数据网格(In-Memory Data Grid),不仅提供了对 Redis 各种数据结构的便捷访问接口,还封装了一系列分布式系统常用的高级功能,其中就包括功能强大、易于使用的分布式锁实现。
Spring Boot 则是当前最流行的 Java 开发框架之一,它通过自动配置和约定大于配置的理念,极大地简化了 Spring 应用的开发过程,使得开发者能够快速搭建出高效、稳定的应用程序。
将 Redisson 与 Spring Boot 进行集成,能够充分发挥两者的优势,为我们提供一种简单、高效的分布式锁解决方案。在本文中,我们将深入探讨如何在 Spring Boot 项目中集成 Redisson 来实现分布式锁,并通过实际的代码示例和详细的解释,帮助大家理解其原理和使用方法,同时也会分享一些在实际应用中可能遇到的问题及解决方案 。
二、认识 Redisson 与分布式锁
2.1 Redisson 简介
Redisson 是一个基于 Redis 的 Java 驻内存数据网格(In-Memory Data Grid)和分布式锁服务。它不仅仅是对 Redis 的简单封装,更是提供了一系列丰富的分布式 Java 数据结构和服务,使得在 Java 应用中使用 Redis 变得更加便捷和强大。Redisson 支持多种 Redis 的部署模式,包括单节点、集群、哨兵和主从模式,这使得它能够适应各种不同规模和复杂度的分布式系统。
在 Redisson 中,你可以像使用本地 Java 对象一样使用各种分布式数据结构,如分布式集合(RSet
、RList
、RMap
等)、分布式队列(RQueue
、RDeque
等)、分布式锁(RLock
、RReadWriteLock
等)以及分布式原子变量(RAtomicLong
、RAtomicDouble
等)。这种高度的抽象和封装极大地简化了分布式系统的开发过程,让开发者可以专注于业务逻辑的实现,而无需过多关注底层的分布式细节。
例如,在使用 Redisson 的分布式锁时,开发者只需要通过简单的RLock lock = redisson.getLock("myLock"); lock.lock();
就可以获取一个分布式锁,而无需手动编写复杂的 Redis 命令和逻辑来实现锁的获取、释放以及锁的过期处理等功能 。
2.2 分布式锁的作用
在分布式系统中,多个节点(如不同的服务器、进程或线程)可能会同时访问和操作共享资源,如数据库中的数据、缓存中的数据或者文件系统中的文件等。如果没有有效的同步机制,就可能会出现数据不一致、竞态条件(Race Condition)等问题。分布式锁的作用就是解决这些问题,它通过一种跨节点的同步机制,确保在同一时刻只有一个客户端能够获取到锁并执行临界区代码,从而避免多个客户端同时对共享资源进行并发访问和修改,保证数据的一致性和完整性。
以电商系统中的库存扣减为例,如果没有分布式锁,当多个用户同时下单购买同一件商品时,可能会出现多个订单同时扣减库存的情况,导致库存数量出现负数,从而引发超卖问题。而使用分布式锁后,只有获取到锁的订单处理线程能够执行库存扣减操作,其他线程需要等待锁的释放,这样就可以确保库存扣减操作的原子性和正确性,避免超卖现象的发生 。
2.3 常见分布式锁实现方式对比
在分布式系统中,除了基于 Redis + Redisson 实现分布式锁外,还有其他常见的实现方式,如基于 MySQL、ZooKeeper 等。下面我们来对比一下这几种实现方式的优缺点:
MySQL 实现分布式锁:利用 MySQL 的表锁或行锁机制,通过在数据库中创建一个锁表,使用唯一索引或FOR UPDATE
语句来实现分布式锁。这种方式的优点是对于已经使用 MySQL 的系统来说,不需要引入额外的中间件,实现相对简单。然而,它的缺点也很明显,由于数据库的读写操作性能相对较低,在高并发场景下,会对数据库造成较大的压力,容易成为性能瓶颈。同时,数据库的可用性也会影响分布式锁的可靠性,如果数据库出现故障,整个分布式锁机制将无法正常工作 。
ZooKeeper 实现分布式锁:ZooKeeper 是一个分布式协调服务,它利用其节点的特性来实现分布式锁。客户端通过在 ZooKeeper 中创建临时顺序节点来竞争锁,并且可以通过监听节点的变化来实现锁的等待和通知机制。ZooKeeper 实现的分布式锁具有较高的可靠性和一致性,能够保证锁的公平性,即按照请求锁的顺序依次获取锁。但是,ZooKeeper 的性能相对 Redis 来说较低,因为它需要进行网络通信和节点的创建、删除等操作,这会带来一定的延迟。此外,ZooKeeper 的部署和维护相对复杂,需要搭建集群来保证高可用性 。
Redis 实现分布式锁:Redis 是一个高性能的内存数据库,它利用SET
命令的NX
(Not eXists)和PX
(过期时间)选项来实现锁的原子获取,通过DEL
命令来释放锁。Redis 实现分布式锁的优点是性能高,获取锁和释放锁的操作非常快,因为它是基于内存操作的。同时,Redis 支持锁的自动过期,这可以有效降低死锁的风险。然而,原生的 Redis 分布式锁实现不是真正意义上的公平锁,无法保证请求锁的顺序。在 Redis 集群模式下,由于数据的分布式存储和同步机制,没有内置的分布式锁支持,需要更为复杂的实现来保证锁的一致性 。
而 Redis + Redisson 的组合则充分发挥了 Redis 的高性能和 Redisson 的丰富功能与便捷性。Redisson 对 Redis 的分布式锁进行了封装和扩展,提供了更高级的锁功能,如可重入锁、公平锁、读写锁等,并且在 Redisson 的实现中,已经考虑了各种复杂的分布式场景和异常情况,使得分布式锁的使用更加安全和可靠。同时,Redisson 的 API 设计简洁易用,大大降低了开发者使用分布式锁的难度 。
三、Spring Boot 集成 Redisson 的步骤
3.1 创建 Spring Boot 项目
如果你是创建全新的 Spring Boot 项目,可以使用 Spring Initializer 来快速搭建项目骨架。打开你的 IDE(如 IntelliJ IDEA、Eclipse 等),在创建新项目时选择 Spring Initializer 选项。在向导中,填写项目的基本信息,如 Group、Artifact、Name 等,然后选择你需要的依赖,这里我们至少需要添加 Spring Web 依赖,方便后续进行测试。
如果你是在现有项目中集成 Redisson,确保项目已经是一个 Spring Boot 项目,并且已经配置好了基本的 Spring 依赖和项目结构 。
3.2 添加 Redisson 依赖
在项目的pom.xml
文件中添加 Redisson 的依赖。如果你使用的是 Maven,添加以下依赖:
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.19.3</version>
</dependency>
在选择 Redisson 版本时,要注意其与 Spring Boot 以及 Redis 的版本兼容性。可以参考 Redisson 官方文档或者相关的版本兼容性对照表,以确保选择的版本能够稳定运行。例如,Spring Boot 2.5.x 版本建议搭配 Redisson 3.16.x 系列版本 。
3.3 配置 Redisson
在application.properties
或application.yml
文件中配置 Redis 的连接信息。如果使用application.properties
,配置如下:
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器端口
spring.redis.port=6379
# Redis密码(如果有)
spring.redis.password=
# 连接超时时间(毫秒)
spring.redis.timeout=3000
如果使用application.yml
,配置如下:
spring:redis:host: 127.0.0.1port: 6379password: timeout: 3000
这些配置将被redisson-spring-boot-starter
自动读取并用于创建 Redisson 客户端连接。如果 Redis 部署在集群环境或者使用了哨兵模式,还需要相应地调整配置 。
3.4 编写配置类(可选)
如果你使用的是redisson-spring-boot-starter
,通常不需要额外编写配置类,因为 Starter 会自动进行配置。但如果有一些特殊的配置需求,比如自定义 Redisson 的线程池大小、编解码器等,或者你没有使用 Starter 方式集成 Redisson,就需要编写配置类来创建RedissonClient
实例。
以下是一个配置类的示例:
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RedissonConfig {@Bean(destroyMethod = "shutdown")public RedissonClient redissonClient() {Config config = new Config();// 使用单机模式连接Redisconfig.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("");return Redisson.create(config);}
}
在这个配置类中,我们创建了一个RedissonClient
实例,并将其注册为 Spring 的 Bean。destroyMethod = "shutdown"
指定了在 Spring 容器关闭时,自动调用RedissonClient
的shutdown
方法来释放资源 。
3.5 测试集成是否成功
编写一个简单的测试代码来验证 Redisson 是否集成成功。可以创建一个 Spring 的 Service 类,在其中注入RedissonClient
,并进行一些简单的操作,如获取一个分布式锁或者操作一个分布式集合。
以下是一个测试获取分布式锁的示例:
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class RedissonTestService {@Autowiredprivate RedissonClient redissonClient;public void testLock() {// 获取一个名为"myLock"的分布式锁RLock lock = redissonClient.getLock("myLock");try {// 尝试获取锁,这里可以设置等待时间和锁的过期时间boolean isLocked = lock.tryLock(10, 60, java.util.concurrent.TimeUnit.SECONDS);if (isLocked) {// 获取到锁,执行临界区代码System.out.println("成功获取到锁,执行临界区代码");// 模拟业务逻辑处理Thread.sleep(3000);} else {// 未获取到锁System.out.println("未能获取到锁");}} catch (InterruptedException e) {e.printStackTrace();} finally {// 释放锁if (lock.isHeldByCurrentThread()) {lock.unlock();System.out.println("锁已释放");}}}
}
然后可以在测试类中调用这个方法进行测试:
import org.junit.jupiter.api.
相关文章:
Spring Boot牵手Redisson:分布式锁实战秘籍
一、引言 在当今的分布式系统架构中,随着业务规模的不断扩大和系统复杂度的日益增加,如何确保多个服务节点之间的数据一致性和操作的原子性成为了一个至关重要的问题。在单机环境下,我们可以轻松地使用线程锁或进程锁来控制对共享资源的访问,但在分布式系统中,由于各个服务…...
【HarmonyOS Next 自定义可拖拽image】
效果图: 代码: import display from "ohos.display" import { AppUtil } from "pura/harmony-utils"/*** 自定义可拖拽图标组件*/ Component export default struct DraggableImage {imageResource?: ResourceimageHeight: numbe…...
基于扑克牌分发效果制作时的问题总结
其基本效果如图 1. 在overlay模式下直接使用position来移动 实现代码 public class Card : MonoBehaviour {public RectTransform target;public Button cardButton;private bool isPack false;public List<RectTransform> cards new List<RectTransform>(…...
为多个GitHub账户配置SSH密钥
背景 当需要同时使用多个GitHub账户(例如工作和个人账户)时,默认的SSH配置可能导致冲突。本文介绍如何通过生成不同的SSH密钥对并配置SSH客户端来管理多个账户。 操作步骤 生成SSH密钥对 为每个GitHub账户生成独立的密钥对,并指…...
三步本地部署deepseekr1,支持macOs,ubuntu,Windows
一、ollama安装: ollama官网:Ollama Ollama 是一款支持在 Windows、macOS 和 Linux 上本地运行大型语言模型的工具。以下是针对不同操作系统的安装指南: 1、Windows 系统 下载安装包:访问 Ollama 官方下载页面,选择适用于 Windows 的安装包进行下载。 运行安装程序:下…...
STM32 HAL库 CANbus通讯(C语言)
#include "main.h" #include "stm32f1xx_hal.h"CAN_HandleTypeDef hcan; CAN_TxHeaderTypeDef TxHeader; CAN_RxHeaderTypeDef RxHeader; uint8_t TxData[8]; uint8_t RxData[8]; uint32_t TxMailbox;void CAN_Init(void) {// 使能CAN时钟__HAL_RCC_CAN1_C…...
Cotex-M系列介绍
一、芯片设计公司——ARM ARM公司:只做内核设计和IP授权,不参与芯片设计 二、Cortex内核分类及特征...
测试自动化落地方向
一、视觉回归自动化测试(低成本高回报) 痛点: UI 频繁迭代导致视觉问题难覆盖 方案: 引入Applitools或SikuliX做视觉比对(无需维护元素定位) 关键路径截图比对,自动检测 UI 错位/样式问题 亮点…...
如何通过优化网站结构提高SEO效果?
很多人以为,SEO就是写写关键词,发点外链,但其实,网站结构才是排名的地基!你可以把网站想象成一栋房子,框架没搭好,装饰再漂亮也没用,迟早会塌。同样的道理,如果网站结构混…...
迅雷下载的原理和使用协议的分析
迅雷作为一款广泛使用的下载工具,其核心原理是通过整合多种下载协议和资源分发技术来提升下载速度。以下是对其原理及协议的详细分析: 一、迅雷下载的核心原理 多协议混合下载(P2SP) P2SP(Peer-to-Server-Peer…...
RPA与深度学习结合
什么是RPA RPA即机器人流程自动化(Robotic Process Automation),它是一种利用软件机器人模拟人类在计算机上的操作,按照预设的规则自动执行一系列重复性、规律性任务的技术。这些任务可以包括数据录入、文件处理、报表生成、系统…...
Linux内核模块参数与性能优化:__read_mostly属性的深度剖析
在Linux内核开发中,模块参数和性能优化是两个至关重要的主题。模块参数允许开发者和用户在加载内核模块时动态配置模块的行为,而性能优化则是确保内核高效运行的关键。本文将深入探讨Linux内核中的模块参数机制以及__read_mostly属性的使用,通过实际代码示例和详细解释,帮助…...
Elasticsearch:如何使用 Elastic 检测恶意浏览器扩展
作者:来着 Elastic Aaron Jewitt 当你的 CISO 询问你的任何工作站上是否安装过特定的浏览器扩展时,你多快能得到正确答案?恶意浏览器扩展是一个重大威胁,许多组织无法管理或检测。这篇博文探讨了 Elastic Infosec 团队如何使用 os…...
基于Java的远程视频会议系统(源码+系统+论文)
第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈,追求远距离的视音频的同步交互成为新的时尚。近些年来,依托计算机技术、通信技术和网络条件的发展,集音频、视频、图像、文字、数据为一体的多媒体信息ÿ…...
SAP-ABAP:FOR ALL ENTRIES IN用法详解带实例代码
在 SAP ABAP 中,FOR ALL ENTRIES IN 是 SELECT 语句中一个非常常用的功能,用于根据内表中的数据查询数据库表。它的主要作用是将内表中的数据作为查询条件,从数据库表中筛选出符合条件的数据。 1. 基本语法 SELECT <fields>FROM <d…...
构建jdk17包含maven的基础镜像
1、先拉取jdk17基础镜像 docker pull openjdk:17-jdk-alpine 2、使用jdk17基础镜像创建容器 docker run -it openjdk:17-jdk-alpine sh 或 docker run -it --name jdk17 openjdk:17-jdk-alpine sh 3、修改镜像源地址 cat /etc/apk/repositories https://mirrors.aliyun.com…...
【Android】版本和API对应关系表
目录 版本和API对应关系表 不积跬步,无以至千里;不积小流,无以成江海。要沉下心来,诗和远方的路费真的很贵! 版本和API对应关系表 版本名版本号名称APIAndroid 1616.0W36Android 1515.0V35Android 1414.0U34Android 1…...
Spring Boot 整合 JPA 实现数据持久化
目录 前言 一、JPA 核心概念与实体映射 1. 什么是 JPA? 2. JPA 的主要组件 3. 实体映射 4. 常见的字段映射策略 二、Repository 接口与自定义查询 1. 什么是 Repository 接口? 2. 动态查询方法 3. 自定义查询 4. 分页与排序 三、实战案例&…...
KUKA 机器人仿真——Simpro4.1和OfficeLite8.6.2 连接实现虚拟示教器
一、准备软件 1、Simpro4.1,是一机一密钥,不好破解,我在某宝买的,省事了。 2、OfficeLite8.6.2,看我的博文的第三步虚拟机内安装OfficeLite8.6.2 KUKA示教器仿真软件OfficeLite8.6.2,EthernetKRL3.1.3通信…...
IntelliJ IDEA使用经验(十三):使用Git克隆github的开源项目
文章目录 问题背景办法1、设置git代理;2、再次克隆项目;3、再次按常规方式进行git克隆即可。 问题背景 由于github在国外,很多时候我们在使用idea克隆开源项目的时候,没办法检出,提示 连接重置。 办法 1、设置git代…...
互联网大厂中面试的高频计算机网络问题及详解
前言 哈喽各位小伙伴们,本期小梁给大家带来了互联网大厂中计算机网络部分的高频面试题,本文会以通俗易懂的语言以及图解形式描述,希望能给大家的面试带来一点帮助,祝大家offer拿到手软!!! 话不多说,我们立刻进入本期正题! 一、计算机网络基础部分 1 先来说说计算机网…...
综合实验练习实验报告
一、需求分析 1.防火墙上配置DHCP服务,完成接口配置 2.用户建立以及认证策略建立 3.安全策略建立 二、详细配置 DHCP配置 [FW1]dhcp enable [FW1]int g1/0/1.1 [FW1-GigabitEthernet1/0/1.1]dhcp select interface [FW1]int g1/0/1.2 [FW1-GigabitEthernet…...
Ubuntu22.04 配置deepseek知识库
文章目录 安装 docker配置 dify配置 ollama创建大模型 安装 docker 更新系统:sudo apt update sudo apt upgrade -y安装必要的依赖:sudo apt install apt-transport-https ca-certificates curl software-properties-common -y添加 Docker 的官方 GPG 密…...
如何在WPS和Word/Excel中直接使用DeepSeek功能
以下是将DeepSeek功能集成到WPS中的详细步骤,无需本地部署模型,直接通过官网连接使用:1. 下载并安装OfficeAI插件 (1)访问OfficeAI插件下载地址:OfficeAI助手 - 免费办公智能AI助手, AI写作,下载…...
Mp4视频播放机无法播放视频-批量修改视频分辨率(帧宽、帧高)
背景 家人有一台夏新多功能 视频播放器(夏新多功能 视频播放器),用来播放广场舞。下载了一些广场舞视频, 只有部分视频可以播放,其他视频均无法播放,判断应该不是帧速率和数据速率的限制, 分析可能是播放器不支持帧高度大于720的视频。由于视频文件较多,需要借助视频编…...
jvm 线程监控调试
文章目录 前言一、使用JDK工具转储线程文件(如jstack)1. 找到Java进程的PID:2. 使用jstack生成线程转储文件:3.验证生成的线程转储文件:二、分析文件1.使用在线工具进行分析上传thread-dump文件,等待解析完成2.查看分析结果总结前言 提示:使用jdk自带工具转储线程监控文…...
超越 DeepSeek V3 -->【Qwen2.5-Max】
🔥 先说明,不是广子,不是广子!!!单纯分享这个工具给大家,毕竟最近使用 DeepSeek 太容易崩了,每天深度思考一次之后就开始转圈圈用不了,然后就找到了这个工具使用 一、前言…...
301.华为交换机堆叠技术基础
华为交换机堆叠技术基础 一、概念及原理部分1.堆叠简介1.1 什么是堆叠1.2 可靠性网络架构1.3 华为堆叠设备1.4 其他厂商的堆叠2.堆叠的示意图3.堆叠的应用3.1 中小企业3.2 园区网4.堆叠的原理4.1基本的概念4.2 堆叠建立4.3 角色选举4.4 版本同步4.5 配置同步4.6 堆叠系统的登录…...
【开源AI】AI一页一页读PDF
【开源AI】AI一页一页读PDF 可以在这里看 : 让AI 处理 PDF 文件,提取其中的知识点,并生成总结。 只是无法修改,后续若有更新在csdn这里。 【OpenAI】 API 更新: JSON 结构化输出约束机制( JSON Schema) 的一次实战。知识库的JSON Schema形式 每一页都要总结,总结的知识…...
Spring AI 介绍
文章来源:AI 概念 (AI Concepts) _ Spring AI1.0.0-SNAPSHOT中文文档(官方文档中文翻译)|Spring 教程 —— CADN开发者文档中心 本节介绍 Spring AI 使用的核心概念。我们建议仔细阅读它,以了解 Spring AI 是如何实现的。 模型 AI 模型是旨在处理和生成…...
React - 事件绑定this
在 React 中,this 的绑定是一个常见问题,尤其在类组件中使用事件处理函数时。JavaScript 中的 bind 函数用于设置函数调用时 this 的值。 bind 函数的作用 bind() 方法创建一个新的函数,当被调用时,其 this 关键字被设置为提供的…...
【3.Git与Github的历史和区别】
目录 Git的历史和Github的区别本质和功能 Git的历史和Github的区别 Git是由Linux内核的创造者Linus Torvalds于2005年创建的。当时,Linux内核开源项目使用BitKeeper作为版本控制系统,但2005年BitKeeper的商业公司终止了与Linux社区的合作,收…...
【设计模式】【行为型模式】职责链模式(Chain of Responsibility)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 📫 欢迎V: flzjcsg2,我们共同讨论Java深渊的奥秘 …...
【算法学习】二分查找开区间写法总结
根据灵神教学中的二分查找开区间写法进行如下总结: 我们需要注意的是,lowerBound 模板求解的是 > target 的最小下标 private int lowerBound(int[] nums, int target) {int left -1;int right nums.length; // 开区间 (left, right)while (left …...
信息科技伦理与道德3-2:智能决策
2.2 智能推荐 推荐算法介绍 推荐系统:猜你喜欢 https://blog.csdn.net/search_129_hr/article/details/120468187 推荐系统–矩阵分解 https://blog.csdn.net/search_129_hr/article/details/121598087 案例一:YouTube推荐算法向儿童推荐不适宜视频 …...
【干活分享】2025年可以免费问答的一些GPT网站-deepseek等免费gpt
2025年已经到来,大家也都陆续回归到忙碌的工作中。在新的一年里,如何更高效地完成工作任务,提升工作效率,是很多人关心的问题。今天,就为大家分享一些实用性很强的GPT网站,帮助大家在工作中事半功倍。 Dee…...
webpack配置之---入口
entry 单入口 由于一般的单页面项目只有一个入口,也就是单入口,单入口的配置方式有以下三种方式,如果有遗漏的欢迎补充 1、字符串方式 以下这几行代码解释: entry:本项目的入口文件 output:本项目打包…...
Golang GORM系列:GORM CRUM操作实战
在数据库管理中,CRUD操作是应用程序的主干,支持数据的创建、检索、更新和删除。强大的Go对象关系映射库GORM通过抽象SQL语句的复杂性,使这些操作变得轻而易举。本文是掌握使用GORM进行CRUD操作的全面指南,提供了在Go应用程序中有效…...
[M模拟] lc380. O(1) 时间插入、删除和获取随机元素(模拟+数据结构+脑筋急转弯+数组快捷删除技巧+项目思考)
文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接:380. O(1) 时间插入、删除和获取随机元素 题单: 待补充 2. 题目解析 其实这个题目抽象一下的话在项目中也能出现,可能日常项目中没有算法基础的话,就很容易直接去进行新内…...
30~32.ppt
目录 30.导游小姚-介绍首都北京❗ 题目 解析 31.小张-旅游产品推广文章 题目 解析 32.小李-水的知识❗ 题目 解析 30.导游小姚-介绍首都北京❗ 题目 解析 新建幻灯片-从大纲-重置-检查设计→主题对话框→浏览主题:考生文件夹(注意&#x…...
一键查看电脑各硬件详细信息 轻松查看电脑硬件参数
今天为大家推荐两款非常实用的电脑硬件查看软件,它们能够一键快速查看电脑的各种配置信息,使用起来非常方便。 一键查看电脑各硬件详细信息 这款软件是绿色版的,无需安装,打开即可使用,文件大小仅为900多KB࿰…...
java如何创建自定义异常?
在Java中,创建自定义异常通常需要继承Exception类或其子类。以下是创建自定义异常的基本步骤: 定义异常类:创建一个新的类,继承自Exception或RuntimeException(根据需要选择)。 构造方法:提供一…...
2025/2/10 心得
第一题。J. C - Grand Garden (AI) 问题陈述 在一个花坛里,有 NN 朵花,编号为 1,2,\ldots,N1,2,…,N。最初,所有花的高度都是 00。你将得到一个高度序列 h{h\_1,h\_2,h\_3,\ldots\} 作为输入。你希望通过重复以下“浇水”操作来将所有花的编…...
Visual Studio 2022 中使用 Google Test
要在 Visual Studio 2022 中使用 Google Test (gtest),可以按照以下步骤进行: 安装 Google Test:确保你已经安装了 Google Test。如果没有安装,可以通过 Visual Studio Installer 安装。在安装程序中,找到并选择 Googl…...
软开关和硬开关
硬开关: 电路结构相对简单,一般只包含基本的开关管、电源、负载等元件,没有专门的谐振电路来辅助开关过程。 开关管在导通或关断时,电压或电流的变化率非常快,形成急剧的开关过程。开通时,开关器件的电流…...
C++17中的std::clamp:限制值的范围
文章目录 一、背景与动机二、std::clamp的定义三、使用示例示例1:基本用法示例2:浮点数和自定义类型 四、实际应用场景1. 游戏开发2. 图形处理3. 数值计算 五、注意事项六、总结 在C17中, std::clamp是一个极为实用的算法,它能够…...
Python的
& 运算符可用于不同集合类型,它主要用于集合的交集操作 下面分别介绍它在 set(集合)和 frozenset(不可变集合)这两种常见集合类型中的使用 set 类型 set 是 Python 中内置的可变集合类型,使用 & …...
计算机毕业设计Spark+大模型知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
13.8 聚焦应用场景的Prompt设计实战:从通用到领域专用的翻译质量跃升
聚焦应用场景的Prompt设计实战:从通用到领域专用的翻译质量跃升 关键词:领域特定Prompt设计、翻译质量优化、动态术语控制、多阶段推理链、Prompt版本管理 1. 翻译Prompt设计核心原则 1.1 领域知识深度渗透 def build_medical_prompt(): return ChatPromptTemplate.from_…...
基础入门-HTTP数据包红蓝队研判自定义构造请求方法请求头修改状态码判断
知识点: 1、请求头&返回包-方法&头修改&状态码等 2、数据包分析-红队攻击工具&蓝队流量研判 3、数据包构造-Reqable自定义添加修改请求 一、演示案例-请求头&返回包-方法&头修改&状态码等 数据包 客户端请求Request 请求方法 …...