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

Java 重试机制详解

文章目录

    • 1. 重试机制基础
      • 1.1 什么是重试机制
      • 1.2 重试机制的关键要素
      • 1.3 适合重试的场景
    • 2. 基础重试实现
      • 2.1 简单循环重试
      • 2.2 带延迟的重试
      • 2.3 指数退避策略
      • 2.4 添加随机抖动
      • 2.5 使用递归实现重试
      • 2.6 可重试异常过滤
    • 3. 常用重试库介绍
      • 3.1 Spring Retry
        • 3.1.1 依赖配置
        • 3.1.2 编程式重试
        • 3.1.3 声明式重试
      • 3.2 Resilience4j
        • 3.2.1 依赖配置
        • 3.2.2 基本使用
        • 3.2.3 高级配置
      • 3.3 Guava Retrying
        • 3.3.1 依赖配置
        • 3.3.2 基本使用
        • 3.3.3 高级配置
      • 3.4 Apache Commons Lang - 轻量级重试工具
        • 3.4.1 依赖配置
        • 3.4.2 基本使用
    • 4. 实际应用场景
      • 4.1 HTTP 请求重试
        • 4.1.1 使用 OkHttp 实现 HTTP 请求重试
        • 4.1.2 使用 Spring RestTemplate 重试
      • 4.2 数据库操作重试
      • 4.3 消息队列消费重试
      • 4.4 分布式锁获取重试
    • 5. 重试机制最佳实践
      • 5.1 设计原则
      • 5.2 避免的陷阱
      • 5.3 性能考虑
      • 5.4 配置建议
      • 5.5 异步重试和重试队列
    • 6. 总结

1. 重试机制基础

1.1 什么是重试机制

重试机制是一种容错设计模式,在分布式系统和网络通信中尤为重要。当操作失败时(例如网络请求超时、数据库连接失败等),系统会自动重新尝试执行该操作,直到成功或达到预定的重试次数上限。

在Java应用程序中,特别是涉及外部服务调用、数据库操作或文件IO等不可靠操作时,合理的重试机制可以:

  • 提高系统的可用性和稳定性
  • 处理瞬时故障,避免级联失败
  • 减少人工干预的需要
  • 优化用户体验

1.2 重试机制的关键要素

一个完善的重试机制通常包含以下几个关键要素:

  1. 重试触发条件:何种异常或错误状态下需要进行重试
  2. 重试次数:最大允许重试的次数
  3. 重试间隔:两次重试之间的时间间隔
  4. 退避策略:重试间隔如何变化(固定、递增、指数等)
  5. 超时机制:整个重试过程的最长允许时间
  6. 恢复策略:重试全部失败后的处理方式
  7. 重试结果处理:成功或失败的回调处理

1.3 适合重试的场景

并非所有失败的操作都适合重试。一般来说,以下场景适合实施重试机制:

  • 幂等操作:重复执行不会产生副作用的操作(如GET请求、查询操作)
  • 瞬时故障:可能自行恢复的短暂故障(如网络抖动、服务器临时过载)
  • 资源竞争:因资源暂时不可用导致的失败(如数据库死锁、连接池耗尽)

不适合重试的场景:

  • 非幂等操作(如未做好幂等性保障的支付操作)
  • 由于请求参数错误导致的失败
  • 因权限不足导致的失败
  • 业务逻辑错误

2. 基础重试实现

2.1 简单循环重试

最基本的重试机制是使用循环来实现:

public class SimpleRetry {public static void main(String[] args) {int maxRetries = 3;int retryCount = 0;boolean success = false;while (!success && retryCount < maxRetries) {try {// 执行可能失败的操作doSomethingRisky();success = true;System.out.println("操作成功!");} catch (Exception e) {retryCount++;System.out.println("操作失败,这是第 " + retryCount + " 次重试");if (retryCount >= maxRetries) {System.out.println("重试次数已达上限,操作最终失败");}}}}private static void doSomethingRisky() throws Exception {// 模拟一个有75%几率失败的操作if (Math.random() < 0.75) {throw new Exception("操作失败,需要重试");}}
}

2.2 带延迟的重试

实际应用中,通常需要在重试之间添加一定的延迟,避免立即重试导致的资源浪费:

public class DelayedRetry {public static void main(String[] args) {int maxRetries = 3;int retryCount = 0;boolean success = false;long retryDelayMillis = 1000; // 1秒延迟while (!success && retryCount < maxRetries) {try {doSomethingRisky();success = true;System.out.println("操作成功!");} catch (Exception e) {retryCount++;System.out.println("操作失败,这是第 " + retryCount + " 次重试");if (retryCount >= maxRetries) {System.out.println("重试次数已达上限,操作最终失败");} else {try {System.out.println("等待 " + retryDelayMillis + " 毫秒后重试...");Thread.sleep(retryDelayMillis);} catch (InterruptedException ie) {Thread.currentThread().interrupt();System.out.println("重试过程被中断");break;}}}}}private static void doSomethingRisky() throws Exception {// 模拟一个有75%几率失败的操作if (Math.random() < 0.75) {throw new Exception("操作失败,需要重试");}}
}

2.3 指数退避策略

在网络请求等场景中,通常使用指数退避策略,即每次重试的等待时间呈指数增长:

public class ExponentialBackoffRetry {public static void main(String[] args) {int maxRetries = 5;int retryCount = 0;boolean success = false;long initialDelayMillis = 1000; // 初始延迟1秒while (!success && retryCount < maxRetries) {try {doSomethingRisky();success = true;System.out.println("操作成功!");} catch (Exception e) {retryCount++;System.out.println("操作失败,这是第 " + retryCount + " 次重试");if (retryCount >= maxRetries) {System.out.println("重试次数已达上限,操作最终失败");} else {// 计算指数退避延迟时间:初始延迟 * (2^重试次数)long delayMillis = initialDelayMillis * (long) Math.pow(2, retryCount - 1);try {System.out.println("等待 " + delayMillis + " 毫秒后重试...");Thread.sleep(delayMillis);} catch (InterruptedException ie) {Thread.currentThread().interrupt();System.out.println("重试过程被中断");break;}}}}}private static void doSomethingRisky() throws Exception {// 模拟一个有75%几率失败的操作if (Math.random() < 0.75) {throw new Exception("操作失败,需要重试");}}
}

2.4 添加随机抖动

在高并发环境中,为了避免大量请求同时重试导致的"惊群效应",通常会给退避时间添加一些随机抖动:

public class JitteredBackoffRetry {public static void main(String[] args) {int maxRetries = 5;int retryCount = 0;boolean success = false;long initialDelayMillis = 1000; // 初始延迟1秒double jitterFactor = 0.5; // 抖动因子while (!success && retryCount < maxRetries) {try {doSomethingRisky();success = true;System.out.println("操作成功!");} catch (Exception e) {retryCount++;System.out.println("操作失败,这是第 " + retryCount + " 次重试");if (retryCount >= maxRetries) {System.out.println("重试次数已达上限,操作最终失败");} else {// 计算指数退避延迟时间long baseDelayMillis = initialDelayMillis * (long) Math.pow(2, retryCount - 1);// 添加随机抖动:基础延迟 ± (基础延迟 * 抖动因子 * 随机值)long jitter = (long) (baseDelayMillis * jitterFactor * Math.random());// 随机决定是加还是减long delayMillis = Math.random() > 0.5 ? baseDelayMillis + jitter : Math.max(0, baseDelayMillis - jitter);try {System.out.println("等待 " + delayMillis + " 毫秒后重试...");Thread.sleep(delayMillis);} catch (InterruptedException ie) {Thread.currentThread().interrupt();System.out.println("重试过程被中断");break;}}}}}private static void doSomethingRisky() throws Exception {// 模拟一个有75%几率失败的操作if (Math.random() < 0.75) {throw new Exception("操作失败,需要重试");}}
}

2.5 使用递归实现重试

除了循环,也可以使用递归来实现重试逻辑:

public class RecursiveRetry {public static void main(String[] args) {try {String result = executeWithRetry(RecursiveRetry::doSomethingRisky, 3, 1000);System.out.println("最终结果: " + result);} catch (Exception e) {System.out.println("操作最终失败: " + e.getMessage());}}// 定义一个函数式接口,表示可能抛出异常的操作@FunctionalInterfaceinterface RiskyOperation<T> {T execute() throws Exception;}// 递归重试方法private static <T> T executeWithRetry(RiskyOperation<T> operation, int maxRetries, long delayMillis) throws Exception {try {return operation.execute();} catch (Exception e) {if (maxRetries > 0) {System.out.println("操作失败,剩余重试次数: " + maxRetries);System.out.println("等待 " + delayMillis + " 毫秒后重试...");try {Thread.sleep(delayMillis);} catch (InterruptedException ie) {Thread.currentThread().interrupt();throw new RuntimeException("重试过程被中断", ie);}// 递归调用,次数减1,延迟翻倍(指数退避)return executeWithRetry(operation, maxRetries - 1, delayMillis * 2);} else {throw new Exception("重试次数已用尽,操作失败: " + e.getMessage(), e);}}}// 模拟一个可能失败的操作private static String doSomethingRisky() throws Exception {if (Math.random() < 0.75) {throw new Exception("操作失败,需要重试");}return "操作成功";}
}

2.6 可重试异常过滤

在实际应用中,我们通常只对特定类型的异常进行重试,对于其他异常则直接失败:

public class SelectiveRetry {public static void main(String[] args) {int maxRetries = 3;int retryCount = 0;boolean success = false;while (!success && retryCount < maxRetries) {try {doSomethingRisky();success = true;System.out.println("操作成功!");} catch (Exception e) {// 只对特定异常进行重试if (isRetryable(e)) {retryCount++;System.out.println("发生可重试异常: " + e.getMessage());System.out.println("这是第 " + retryCount + " 次重试");if (retryCount >= maxRetries) {System.out.println("重试次数已达上限,操作最终失败");} else {try {Thread.sleep(1000);} catch (InterruptedException ie) {Thread.currentThread().interrupt();break;}}} else {// 对于不可重试的异常,直接失败退出System.out.println("发生不可重试异常: " + e.getMessage());System.out.println("立即退出重试");break;}}}}// 判断异常是否可重试private static boolean isRetryable(Exception e) {// 例如,只对超时、连接和IO异常进行重试return e instanceof java.net.SocketTimeoutException ||e instanceof java.net.ConnectException ||e instanceof java.io.IOException;}private static void doSomethingRisky() throws Exception {double random = Math.random();if (random < 0.4) {// 模拟一个可重试的异常throw new java.net.SocketTimeoutException("网络超时");} else if (random < 0.7) {// 模拟一个不可重试的异常throw new IllegalArgumentException("参数错误");}// 成功}
}

3. 常用重试库介绍

除了手动实现重试逻辑,Java生态系统中有许多成熟的重试库,提供了更加灵活和强大的重试机制。下面介绍几个常用的重试库:

3.1 Spring Retry

Spring Retry 是 Spring 生态系统中的一个重试库,提供了声明式重试和编程式重试两种方式。

3.1.1 依赖配置
<!-- Maven依赖 -->
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.3.4</version>
</dependency><!-- 如果使用声明式重试,需要添加AOP依赖 -->

相关文章:

Java 重试机制详解

文章目录 1. 重试机制基础1.1 什么是重试机制1.2 重试机制的关键要素1.3 适合重试的场景2. 基础重试实现2.1 简单循环重试2.2 带延迟的重试2.3 指数退避策略2.4 添加随机抖动2.5 使用递归实现重试2.6 可重试异常过滤3. 常用重试库介绍3.1 Spring Retry3.1.1 依赖配置3.1.2 编程…...

Spark缓存---cache方法

在Spark 中&#xff0c;cache() 是用于优化计算性能的核心方法之一&#xff0c;但它有许多细节需要深入理解。以下是关于 cache() 的详细技术解析&#xff1a; 1. cache() 的本质 简化的 persist()&#xff1a;cache() 是 persist(StorageLevel.MEMORY_ONLY) 的快捷方式&#…...

一分钟了解大语言模型(LLMs)

一分钟了解大语言模型&#xff08;LLMs&#xff09; A Minute to Know about Large Language Models (LLMs) By JacksonML 自从ChatGPT上线发布以来&#xff0c;在短短的两年多时间里&#xff0c;全球ChatBot&#xff08;聊天机器人&#xff09;发展异常迅猛&#xff0c;更为…...

当数控编程“联姻”AI:制造工厂的“智能大脑”如何炼成?

随着DeepSeek乃至AI人工智能技术在企业中得到了广泛的关注和使用&#xff0c;多数企业开始了AI探索之旅&#xff0c;迅易科技也不例外&#xff0c;且在不断地实践中强化了AI智能应用创新的强大能力。许多制造企业面临着工艺知识传承困难、编程效率低下等诸多挑战&#xff0c; 今…...

鸿蒙OSUniApp 实现的二维码扫描与生成组件#三方框架 #Uniapp

UniApp 实现的二维码扫描与生成组件 前言 最近在做一个电商小程序时&#xff0c;遇到了需要扫描和生成二维码的需求。在移动应用开发中&#xff0c;二维码功能已经成为标配&#xff0c;特别是在电商、社交和支付等场景下。UniApp作为一个跨平台开发框架&#xff0c;为我们提供…...

【Python 内置函数】

Python 内置函数是语言核心功能的直接体现&#xff0c;无需导入即可使用。以下是精选的 10 大类、50 核心内置函数详解&#xff0c;涵盖日常开发高频场景&#xff1a; 一、数据类型转换 函数示例说明int()int("123") → 123字符串/浮点数转整数float()float("3…...

鸿蒙OSUniApp开发支持多语言的国际化组件#三方框架 #Uniapp

使用UniApp开发支持多语言的国际化组件 在全球化的今天&#xff0c;一个优秀的应用往往需要支持多种语言以满足不同地区用户的需求。本文将详细讲解如何在UniApp框架中实现一套完整的国际化解决方案&#xff0c;从而轻松实现多语言切换功能。 前言 去年接手了一个面向国际市场…...

MySQL之基础事务

目录 引言&#xff1a; 什么是事务&#xff1f; 事务和锁 mysql数据库控制台事务的几个重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意图&#xff1a; 2.事务的隔离级别 四种隔离级别&#xff1a; 总结一下隔离指令 1. 查看当前隔离级别​​ …...

OpenHarmony系统HDF驱动开发介绍(补充)

一、HDF驱动简介 HDF&#xff08;Hardware Driver Foundation&#xff09;驱动框架&#xff0c;为驱动开发者提供驱动框架能力&#xff0c;包括驱动加载、驱动服务管理、驱动消息机制和配置管理。 简单来说&#xff1a;HDF框架的驱动和Linux的驱动比较相似都是由配置文件和驱动…...

深度学习中的查全率与查准率:如何实现有效权衡

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型辅助生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认…...

文件名是 ‪E:\20250512_191204.mp4, EV软件录屏,未保存直接关机损坏, 如何修复?

去github上下载untrunc 工具就能修复 https://github.com/anthwlock/untrunc/releases 如果访问不了 本机的 hosts文件设置 140.82.112.3 github.com 199.232.69.194 github.global.ssl.fastly.net 就能访问了 实在不行&#xff0c;从这里下载&#xff0c;传上去了 https://do…...

界面控件DevExpress WinForms v24.2 - 数据处理功能增强

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…...

Web UI测试效率低?来试Parasoft Selenic的智能修复与分析!

如果你正在使用Selenium进行Web UI测试&#xff0c;但被测试维护的繁琐、测试不稳定以及测试执行缓慢等问题困扰&#xff0c;不妨试试Parasoft Selenic&#xff01; Parasoft Selenic能够通过智能修复与分析功能&#xff0c;帮你自动检测并修复测试中的不稳定因素&#xff0c;…...

计算机视觉最不卷的方向:三维重建学习路线梳理

提到计算机视觉&#xff08;CV&#xff09;&#xff0c;大多数人脑海中会立马浮现出一个字&#xff1a;“卷”。卷到什么程度呢&#xff1f;2022年秋招CV工程师岗位数下降了16%&#xff0c;但求职人数增加了23%&#xff0c;求职人数与招聘岗位的比例达到了恐怖的15:1&#xff0…...

国产 ETL 数据集成厂商推荐—谷云科技 RestCloud

数字化转型加速推进的商业环境中&#xff0c;数据已成为企业最为关键的资产之一。然而&#xff0c;随着企业信息化的建设不断深入&#xff0c;各个业务系统之间数据分散、格式不一、难以互通等问题日益凸显&#xff0c;严重制约了企业对数据价值的深度挖掘与高效利用。在此背景…...

vscode extention踩坑记

# npx vsce package --allow-missing-repository --no-dependencies #耗时且不稳定 npx vsce package --allow-missing-repository #用这行 code --install-extension $vsixFileName --force我问ai&#xff1a;为什么我的.vsix文件大了那么多 ai答&#xff1a;因为你没有用 --n…...

AI时代的弯道超车之第十二章:英语和编程重要性?

在这个AI重塑世界的时代,你还在原地观望吗?是时候弯道超车,抢占先机了! 李尚龙倾力打造——《AI时代的弯道超车:用人工智能逆袭人生》专栏,带你系统掌握AI知识,从入门到实战,全方位提升认知与竞争力! 内容亮点: AI基础 + 核心技术讲解 职场赋能 + 创业路径揭秘 打破…...

关于数据湖和数据仓的一些概念

一、前言 随着各行业数字化发展的深化,数据资产和数据价值已越来越被深入企业重要发展的战略重心,海量数据已成为多数企业生产实际面临的重要问题,无论存储容量还是成本,可靠性都成为考验企业数据治理的考验。本文来看下海量数据存储的数据湖和数据仓,数据仓库和数据湖,…...

hbase shell的常用命令

一、hbase shell的基础命令 # 客户端登录 [rootCloud-Hadoop-NN-02 hbase]$ ./bin/hbase shell# 查看所有表 hbase> list### 创建数据表student&#xff0c;包含Sname、Ssex、Sage、Sdept、course列族/列 ### 说明&#xff1a;列族不指定列名时&#xff0c;列族可以直接成为…...

高并发内存池(四):Page Cache结构设计

目录 一&#xff0c;项目整体框架回顾 Thread Cache结构 Central Cache结构 二&#xff0c;Page Cache大致框架 三&#xff0c;Page Cache申请内存实现 Central Cache向Page Cache申请内存接口 从Page Cache中获取span接口 Page Cache加锁问题 申请内存完整过程 源码&a…...

易学探索助手-项目记录(九)

本文介绍本地大模型推理数据集构成 &#xff08;一&#xff09;古籍数据获取 以44种竖向从右至左排列的繁体古文为研究对象&#xff0c;通过OCR识别、XML结构化处理&#xff0c;最终生成符合大模型训练要求的数据集。 1.技术路线设计 图像处理层&#xff1a;PaddleOCR识别竖…...

Idea 设置编码UTF-8 Idea中 .properties 配置文件中文乱码

Idea 设置编码UTF-8 Idea中 .properties 配置文件中文乱码 一、设置编码 1、步骤&#xff1a; File -> Setting -> Editor -> File encodings --> 设置编码二、配置文件中文乱码 1、步骤&#xff1a; File -> Setting -> Editor -> File encodings ->…...

Redis缓存穿透、雪崩、击穿的解决方案?

Redis 缓存问题解决方案及Java实现 一、缓存穿透解决方案 &#xff08;缓存穿透指查询不存在数据&#xff0c;绕过缓存直接访问数据库&#xff09; 1. 布隆过滤器 空值缓存 注意点&#xff1a; 1.布隆过滤器是需要预热数据的&#xff0c;就是需要输入当前数据库已经存在的…...

第29节:现代CNN架构-Inception系列模型

引言 Inception系列模型是卷积神经网络(CNN)发展历程中的重要里程碑,由Google研究人员提出并不断演进。这一系列模型通过创新的架构设计,在保持计算效率的同时显著提升了图像识别任务的性能。从最初的Inception v1到最新的Inception-ResNet,每一代Inception模型都引入了突破…...

初识C++:类和对象(上)

概述&#xff1a;本篇博客主要讲解类和对象的学习。 目录 1. 类的定义 1.1 类定义格式 1.2 访问限定符 1.3 类域 2.实例化 2.1 实例化概念 2.2 this指针 3. 小结 1. 类的定义 1.1 类定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{} 中为类的…...

腾讯 IMA 工作台升级:新增知识库广场与 @提问功能

目录 一、引言 二、知识库广场功能 2.1 功能架构解析 2.2 技术实现突破 三、知识库提问功能 3.1 交互模式革新 3.2 技术底层逻辑 四、实战价值 4.1 知识管理方面 4.2 工作效率提升方面 4.3 团队协作方面 4.4 知识变现方面 五、未来展望 5.1 技术演进方向 5.2 商业…...

[目标检测] YOLO系列算法讲解

前言 目标检测就是做到给模型输入一张图片或者视频&#xff0c;模型可以迅速判断出视频和图片里面感兴趣的目标所有的位置和它 的类别&#xff0c;而当前最热门的目标检测的模型也就是YOLO系列了。 YOLO系列的模型的提出&#xff0c;是为了解决当时目标检测的模型帧率太低而提…...

Python 之 selenium 打开浏览器指定端口进行接续操作

一般使用 selenium 进行数据爬取时&#xff0c;常用处理流程是让 selenium 从打开浏览器开始&#xff0c;完成全流程的所有操作。但是有时候&#xff0c;我们希望用户先自己打开浏览器进入指定网页&#xff0c;完成登录认证等一系列操作之后&#xff08;比如用户、密码、短信验…...

GPUGeek携手ComfyUI :低成本文生图的高效解决方案

一、文生图领域的困境与ComfyUI的优势 在当今数字化创意表达的时代&#xff0c;文生图技术日益受到关注。像豆包这类以语言交互为主的大模型&#xff0c;虽然在文本处理上表现出色&#xff0c;但在文生图方面&#xff0c;其生成效果难以达到专业图像创作的要求。而Midjourney&…...

OpenCV CUDA 模块中用于在 GPU 上计算两个数组对应元素差值的绝对值函数absdiff(

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 void cv::cuda::absdiff 是 OpenCV CUDA 模块中的一个函数&#xff0c;用于在 GPU 上计算两个数组对应元素差值的绝对值。 该函数会逐元素计算两…...

互联网大厂Java面试题:深入解析SpringCloud微服务架构中的服务注册与发现机制

互联网大厂Java面试题&#xff1a;深入解析SpringCloud微服务架构中的服务注册与发现机制 面试题 问题&#xff1a; 在SpringCloud微服务架构中&#xff0c;服务注册与发现是核心功能之一。请详细说明Nacos作为服务注册中心的实现原理&#xff0c;并对比其与Eureka的异同点。…...

东芝新四款产品“TB67Z830SFTG、TB67Z830HFTG、TB67Z850SFTG、TB67Z850HFTG系列三相栅极驱动器ic三相栅极驱动器IC

支持用于电动工具、吸尘器、工业机器人等的三相无刷DC电机 东芝电子设备与存储公司(简称“东芝”)推出了TB67Z83xxFTG系列三相栅极驱动器ic的四个产品和TB67Z85xxFTG系列三相栅极驱动器IC的四个产品&#xff0c;用于消费和工业设备的三相无刷DC电机。通过将新产品与作为电机控制…...

react+html-docx-js将页面导出为docx

1.主要使用&#xff1a;html-docx-js进行前端导出 2.只兼容到word&#xff0c;wps兼容不太好 3.处理分页换行 4.处理页眉 index.tsx import { saveAs } from file-saver; import htmlToDocxGenerate from ./HtmlToDocx;const handleExportByHtml async () > {const expor…...

Linux基础 -- SSH 流式烧录与压缩传输笔记

Linux SSH 流式烧录与压缩传输指南 一、背景介绍 在嵌入式开发和维护中&#xff0c;常常需要通过 SSH 从 PC 向设备端传输大文件&#xff08;如系统镜像、固件&#xff09;并将其直接烧录到指定磁盘&#xff08;如 /dev/mmcblk2&#xff09;。然而&#xff0c;设备端存储空间…...

<论文>(微软)避免推荐域外物品:基于LLM的受限生成式推荐

一、摘要 本文介绍微软和深圳大学合作发表于2025年5月的论文《Avoid Recommending Out-of-Domain Items: Constrained Generative Recommendation with LLMs》。论文主要研究如何解决大语言模型&#xff08;LLMs&#xff09;在推荐系统中推荐域外物品的问题&#xff0c;提出了 …...

2025年渗透测试面试题总结-360[实习]安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 1. 自我介绍 2. WAF及其绕过方式 3. IPS/IDS/HIDS 4. 云安全 5. 绕过安骑士/安全狗 6. Gopher扩展…...

【机器学习】支持向量回归(SVR)从入门到实战:原理、实现与优化指南

前言 在机器学习的广阔领域中&#xff0c;回归分析作为预测连续型变量的重要手段&#xff0c;被广泛应用于金融预测、工业生产、科学研究等诸多场景。支持向量回归&#xff08;SVR&#xff09;作为回归算法家族中的佼佼者&#xff0c;凭借独特的理论优势与强大的实践能力脱颖而…...

右值引用的学习

传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用&#xff0c;都是给对象取别名。 左值引用和右值引用 在讲之前&#xff0c;我们先来看一下什么是左值和右值…...

碎片笔记|AI生成图像溯源方法源码复现经验(持续更新中……)

前言&#xff1a;本篇博客分享一些溯源方法的复现经验&#xff0c;希望能帮助到大家&#x1f389;。 目录 1. Close-set AttributionRepmixDe-FakeDNA-Net 2. Open-set AttributionPOSE 3. Single-Model AttributionOCC-CLIPLatentTracer 1. Close-set Attribution Repmix 论…...

elementplus el-tree 二次封装支持配置删除后展示展开或折叠编辑复选框懒加载功能

本文介绍了基于 ElementPlus 的 el-tree 组件进行二次封装的 TreeView 组件&#xff0c;使用 Vue3 和 JavaScript 实现。TreeView 组件通过 props 接收树形数据、配置项等&#xff0c;支持懒加载、节点展开/收起、节点点击、删除、编辑等操作。组件内部通过 ref 管理树实例&…...

【C/C++】深度探索c++对象模型_笔记

1. 对象内存布局 (1) 普通类&#xff08;无虚函数&#xff09; 成员变量排列&#xff1a;按声明顺序存储&#xff0c;但编译器会根据内存对齐规则插入填充字节&#xff08;padding&#xff09;。class Simple {char a; // 1字节&#xff08;偏移0&#xff09;int b; …...

Spring MVC数据绑定和响应 你了解多少?

数据绑定的概念 在程序运行时&#xff0c;Spring MVC接收到客户端的请求后&#xff0c;会根据客户端请求的参数和请求头等数据信息&#xff0c;将参数以特定的方式转换并绑定到处理器的形参中。Spring MVC中将请求消息数据与处理器的形参建立连接的过程就是Spring MVC的数据绑…...

外贸礼品禁忌

一、亚洲 1.印度 牛是神圣动物&#xff0c;别送牛皮制品。另外&#xff0c;左手不洁&#xff0c;送礼得用右手或双手。 2.日本 “梳” 和 “苦” 谐音&#xff0c;不送梳子。日本男性不咋佩戴首饰&#xff0c;除结婚戒指。礼物得装盒、纸包、绳饰&#xff0c;白色包装得有…...

【MySQL 基础篇】深入解析MySQL逻辑架构与查询执行流程

1 MySQL逻辑架构概述 MySQL 的逻辑架构主要分为 Server 层和存储引擎层两部分。 Server 层&#xff1a;包含连接器、查询缓存、分析器、优化器、执行器等组件。同时&#xff0c;所有的内置函数&#xff08;如日期、时间、数学和加密函数等&#xff09;也在这一层实现。此外&a…...

基于C#实现中央定位服务器的 P2P 网络聊天系统

基于中央定位服务器的 P2P 网络聊天系统 1 需求分析与实现功能 本次作业旨在实现一个基于中央定位服务器的 P2P 网络聊天系统&#xff0c;也即通过中央定位服务器实现登入&#xff0c;登出与好友的 IP 查询等操作&#xff0c;在好友间的通信使用 P2P 来完成&#xff0c;具体见…...

【C++】map和set的模拟实现

1.底层红黑树节点的定义 enum Colur {RED,BLACK }; template<class T> struct RBTreeNode {RBTreeNode<T>* _left;RBTreeNode<T>* _right;RBTreeNode<T>* _parent;T _data;Colur _col;RBTreeNode(const T& data):_left(nullptr), _right(nullptr…...

数据结构·字典树

字典树trie 顾名思义&#xff0c;在一个字符串的集合里查询某个字符串是否存在树形结构。 树存储方式上用的是结构体数组&#xff0c;类似满二叉树的形式。 模板 定义结构体和trie 结构体必须的内容&#xff1a;当前结点的字符&#xff0c;孩子数组可选&#xff1a;end用于查…...

centos服务器,疑似感染phishing家族钓鱼软件的检查

如果怀疑 CentOS 服务器感染了 Phishing 家族钓鱼软件&#xff0c;需要立即进行全面检查并采取相应措施。以下是详细的检查和处理步骤&#xff1a; 1. 立即隔离服务器 如果可能&#xff0c;将服务器从网络中隔离&#xff0c;以防止进一步传播或数据泄露。如果无法完全隔离&…...

(C语言)超市管理系统(测试2版)(指针)(数据结构)(清屏操作)

目录 前言&#xff1a; 源代码&#xff1a; product.h product.c fileio.h fileio.c main.c 代码解析&#xff1a; 一、程序结构概述 二、product.c 函数详解 1. 初始化商品列表 Init_products 2. 添加商品 add_product 3. 显示商品 display_products 4. 修改商品 mo…...

可变形卷积简介(Deformable Convolution)

1. 核心原理 可变形卷积通过动态调整卷积核的采样位置&#xff0c;增强模型对几何形变&#xff08;如旋转、缩放&#xff09;的适应能力。其核心改进包括&#xff1a; 偏移量&#xff08;Offset&#xff09;&#xff1a;为卷积核的每个采样点学习 x / y x/y x/y方向的偏移量 …...