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

Spring Boot 与 RabbitMQ 的深度集成实践(一)

引言

**

{"type":"load_by_key","key":"auto_image_0_0","image_type":"search"}

在当今的分布式系统架构中,随着业务复杂度的不断提升以及系统规模的持续扩张,如何实现系统组件之间高效、可靠的通信成为了关键问题。消息队列作为一种重要的中间件技术,应运而生并发挥着举足轻重的作用。

消息队列的核心价值在于其能够实现异步通信,有效解耦系统中的不同组件。在传统的同步通信模式下,组件之间的调用往往是直接且即时的,这就导致了组件之间存在紧密的依赖关系。一旦某个组件出现故障或者性能瓶颈,将会直接影响到整个系统的运行。而消息队列的引入打破了这种紧密耦合,生产者将消息发送到队列中后,无需等待消费者立即处理,即可继续执行其他任务,消费者则可以按照自己的节奏从队列中获取消息并进行处理 。这种异步处理方式极大地提高了系统的响应速度和吞吐量,同时也增强了系统的稳定性和可扩展性。例如,在电商系统中,用户下单后,订单信息可以通过消息队列异步地发送给库存系统、物流系统等进行后续处理,而无需用户等待所有系统处理完成,大大提升了用户体验。

在众多优秀的消息队列产品中,RabbitMQ 凭借其卓越的性能、丰富的功能以及强大的可靠性脱颖而出,成为了广泛应用于各类企业级项目的消息中间件。它基于 AMQP(高级消息队列协议)实现,具备灵活的路由机制、消息持久化能力以及对多种消息模式的支持,如点对点、发布 / 订阅等。

Spring Boot 作为当前 Java 开发领域中最受欢迎的框架之一,以其 “约定优于配置” 的理念,极大地简化了 Spring 应用的搭建和开发过程。通过大量的自动配置和 starter 依赖,开发者可以快速构建出一个功能完备的 Spring 应用,专注于业务逻辑的实现,而无需花费大量时间在繁琐的配置工作上。

当把 Spring Boot 与 RabbitMQ 进行深度集成时,两者的优势得以充分结合。Spring Boot 提供的便捷开发体验和强大的生态系统,能够与 RabbitMQ 高效的消息处理能力完美融合,为开发者打造出一个高效、可靠、易于维护的分布式消息通信解决方案。无论是在构建微服务架构、实现分布式事务,还是处理高并发、高流量的业务场景,Spring Boot 与 RabbitMQ 的集成实践都能发挥出巨大的价值,帮助企业提升系统性能,降低开发成本,增强市场竞争力。接下来,我们将深入探讨如何在 Spring Boot 项目中实现与 RabbitMQ 的深度集成。

技术背景

Spring Boot 框架简介

Spring Boot 是基于 Spring 框架构建的,旨在简化 Spring 应用的初始搭建和开发过程。它通过 “约定优于配置” 的理念,大大减少了开发者在配置文件上花费的时间和精力。

Spring Boot 的核心特性之一是自动配置。它能够根据项目中引入的依赖,自动配置 Spring 及第三方库的相关 Bean。例如,当项目中引入了 MySQL 的依赖时,Spring Boot 会自动配置数据源、事务管理器等与数据库相关的组件,开发者无需手动编写大量的 XML 配置或 Java 配置类。这一特性基于 @EnableAutoConfiguration 注解实现,该注解会触发 Spring Boot 的自动配置机制,扫描项目中的依赖,并根据条件注解(如 @ConditionalOnClass、@ConditionalOnProperty 等)来决定是否应用某个自动配置。例如,@ConditionalOnClass 表示只有当类路径中存在指定的类时,才会进行相关的自动配置。

起步依赖(Starters)也是 Spring Boot 的重要特性。它是一种特殊的 Maven 或 Gradle 依赖,定义了一组项目开发中常用的依赖。比如,spring-boot-starter-web 依赖就包含了构建 Web 应用所需的 Spring MVC、Tomcat 等依赖。开发者只需引入相应的起步依赖,Maven 或 Gradle 就会自动下载和管理这些依赖及其传递依赖,极大地简化了项目依赖管理。通过起步依赖,开发者可以快速集成各种功能,如数据库访问、消息队列、安全认证等,而无需逐个查找和添加所需的依赖库。

此外,Spring Boot 还支持创建独立运行的 Spring 应用程序,内置了多种 Servlet 容器(如 Tomcat、Jetty 和 Undertow),开发者可以直接将应用程序打包成可执行的 JAR 或 WAR 文件,无需部署到外部应用服务器即可运行,进一步简化了应用的部署过程。同时,它提供了灵活的配置管理机制,支持将配置信息外部化到 application.properties 或 application.yml 文件中,还可以通过环境变量和命令行参数来设置配置信息,方便在不同环境下进行配置管理。

RabbitMQ 消息队列概述

RabbitMQ 是一个基于 AMQP(高级消息队列协议)的开源消息队列系统,在分布式系统中承担着异步通信和消息传递的重要职责。

其架构主要由生产者(Producer)、消费者(Consumer)、队列(Queue)、交换机(Exchange)和绑定(Binding)等组件构成 。生产者是消息的发送方,负责创建并将消息发送到 RabbitMQ 服务器;消费者则是消息的接收方,从 RabbitMQ 服务器获取消息并进行处理。队列是消息的存储容器,用于暂存消息,直到被消费者消费。

交换机在 RabbitMQ 中扮演着消息路由的关键角色。它接收生产者发送的消息,并根据预设的路由规则将消息转发到一个或多个队列中。RabbitMQ 提供了多种类型的交换机,以满足不同的路由需求。例如,Direct Exchange(直连交换机)根据消息的路由键(Routing Key)进行精确匹配,将消息路由到与之绑定的队列;Fanout Exchange(扇形交换机)则无视路由键,将消息广播到所有与之绑定的队列;Topic Exchange(主题交换机)支持使用通配符模式匹配路由键,实现更灵活的消息路由 。

绑定则是建立交换机和队列之间关联的纽带,通过绑定,交换机能够知道将消息发送到哪些队列。每个绑定都可以指定一个路由键,用于匹配消息的路由键,从而决定消息的路由方向。

RabbitMQ 的工作原理基于生产者 - 消费者模型。生产者通过网络连接将消息发送到 RabbitMQ 服务器的交换机,交换机根据绑定规则和消息的路由键,将消息路由到相应的队列中。队列存储消息,等待消费者来获取。消费者与 RabbitMQ 服务器建立连接后,监听指定的队列,一旦队列中有新消息,消费者就可以获取并处理。为了确保消息的可靠传递,RabbitMQ 还提供了消息持久化、确认机制、事务机制等功能,保证在服务器故障或网络异常等情况下,消息不会丢失。

集成的意义和优势

将 Spring Boot 与 RabbitMQ 集成,能为应用系统带来多方面的显著优势。

在系统解耦方面,传统的同步调用方式使得系统组件之间紧密耦合,一个组件的修改或故障可能会影响到其他组件。而通过集成 RabbitMQ,生产者将消息发送到队列后,无需等待消费者处理结果,即可继续执行其他任务,生产者和消费者之间通过消息进行通信,实现了松耦合。例如,在电商系统中,订单服务、库存服务和物流服务之间通过消息队列进行交互,当用户下单后,订单服务只需将订单消息发送到队列,库存服务和物流服务根据各自的节奏从队列中获取消息并处理,各服务之间互不干扰,提高了系统的可维护性和可扩展性。

在异步处理方面,RabbitMQ 的异步特性使得系统能够将一些耗时的任务放入队列中,由后台线程异步处理,从而提高系统的响应速度。比如,在用户注册场景中,注册成功后需要发送欢迎邮件和短信通知,这些操作可以通过消息队列异步处理,用户无需等待邮件和短信发送完成即可继续使用系统,大大提升了用户体验。同时,异步处理还可以有效地削峰填谷,当系统面临高并发请求时,消息队列可以作为缓冲,将请求消息暂存起来,避免系统因瞬间高负载而崩溃。

从提高系统响应性能来看,由于消息队列的异步处理和削峰作用,系统能够更快地响应外部请求,提高了系统的吞吐量和并发处理能力。而且,通过合理配置 RabbitMQ 的集群和队列,还可以实现负载均衡,将消息分发到不同的消费者节点上进行处理,进一步提升系统的整体性能。

集成准备

环境搭建

在开始集成 Spring Boot 与 RabbitMQ 之前,需要确保开发环境中安装并配置好以下软件:

  • Java 环境:RabbitMQ 和 Spring Boot 都运行在 Java 虚拟机上,因此需要安装 Java Development Kit(JDK)。建议使用 JDK 1.8 或更高版本。可以从 Oracle 官方网站或 OpenJDK 项目官网下载并安装 JDK。安装完成后,配置JAVA_HOME环境变量,指向 JDK 的安装目录,同时将%JAVA_HOME%\bin添加到PATH环境变量中,以便在命令行中能够执行java和javac等命令。例如,在 Windows 系统中,如果 JDK 安装在C:\Program Files\Java\jdk1.8.0_291目录下,则需要在系统环境变量中新建JAVA_HOME变量,值为C:\Program Files\Java\jdk1.8.0_291,然后在PATH变量中添加%JAVA_HOME%\bin。在 Linux 系统中,可以通过编辑~/.bashrc或/etc/profile文件来配置环境变量。
  • Maven:Maven 是一个项目管理和构建工具,用于管理项目的依赖和构建过程。可以从 Maven 官方网站下载 Maven 的二进制压缩包,解压到指定目录后,配置MAVEN_HOME环境变量,指向 Maven 的安装目录,并将%MAVEN_HOME%\bin添加到PATH环境变量中。例如,在 Windows 系统中,若 Maven 解压到D:\apache-maven-3.8.4目录下,需要新建MAVEN_HOME变量,值为D:\apache-maven-3.8.4,然后在PATH变量中添加%MAVEN_HOME%\bin。在 Linux 系统中,同样通过编辑相关配置文件来完成环境变量的设置。安装完成后,可以在命令行中执行mvn -version命令来验证 Maven 是否安装成功,并查看其版本信息。
  • RabbitMQ:RabbitMQ 的安装步骤会因操作系统的不同而有所差异。在 Windows 系统中,可以从 RabbitMQ 官方网站下载安装包,按照安装向导的提示进行安装。安装完成后,需要配置环境变量,将 RabbitMQ 的sbin目录添加到PATH中。在 Linux 系统中,可以使用包管理器进行安装,如在 Debian 或 Ubuntu 系统中,可以使用以下命令安装:
 

sudo apt-get update

sudo apt-get install rabbitmq-server

安装完成后,启动 RabbitMQ 服务:

 

sudo systemctl start rabbitmq-server

并设置开机自启:

 

sudo systemctl enable rabbitmq-server

为了便于管理和监控 RabbitMQ,还可以启用 RabbitMQ 的管理插件。在命令行中执行以下命令启用管理插件:

 

rabbitmq-plugins enable rabbitmq_management

启用后,可以通过浏览器访问http://localhost:15672(默认用户名和密码都是guest)来打开 RabbitMQ 的管理界面,在该界面中可以查看队列、交换机、绑定关系等信息,还可以进行用户管理、权限设置等操作。

创建 Spring Boot 项目

可以使用 Spring Initializr 来快速创建一个 Spring Boot 项目。Spring Initializr 是 Spring 官方提供的一个在线项目生成工具,它可以根据用户的选择生成一个预配置好的 Spring Boot 项目骨架。

打开浏览器,访问https://start.spring.io/,这是 Spring Initializr 的官方网站。在该页面中,可以进行以下配置:

  • 项目构建工具:选择Maven Project,Maven 是一种常用的项目管理工具,它使用pom.xml文件来管理项目的依赖和构建配置。
  • 编程语言:选择Java,因为我们使用 Java 语言进行开发。
  • Spring Boot 版本:选择最新的稳定版本,以获得最新的功能和性能优化。
  • 项目元数据
    • Group:填写项目的组织标识符,通常是公司或组织的域名反转形式,例如com.example。
    • Artifact:填写项目名称,例如spring-boot-rabbitmq-demo,这个名称会作为生成的 JAR 文件名的一部分。
    • Name:填写项目的显示名称,也可以保持与 Artifact 一致。
    • Description:填写项目的简要描述,用于说明项目的功能和用途。
    • Package name:填写项目的包名,通常根据 Group 和 Artifact 自动生成,例如com.example.springbootrabbitmqdemo。
    • Packaging:选择Jar,表示将项目打包成可执行的 JAR 文件,这是 Spring Boot 项目的常见打包方式。
    • Java:选择与开发环境匹配的 Java 版本,例如11。

在Dependencies区域,点击 “Add Dependencies” 按钮,搜索并添加以下依赖:

  • Spring Web:用于构建 Web 应用程序,提供了创建 RESTful 服务的支持,方便我们通过 HTTP 接口来发送和接收消息。
  • Spring for RabbitMQ:即spring-boot-starter-amqp,这是 Spring Boot 集成 RabbitMQ 的核心依赖,它包含了与 RabbitMQ 进行交互所需的各种组件和配置。

完成上述配置后,点击页面底部的 “Generate” 按钮,Spring Initializr 会根据配置生成一个 ZIP 压缩包,下载并解压该压缩包到本地的工作目录中。

接下来,将项目导入到开发工具中。如果使用 IntelliJ IDEA,可以打开 IDEA,点击 “File” -> “Open”,选择解压后的项目目录,然后点击 “OK”。IDEA 会自动检测到这是一个 Maven 项目,并提示导入 Maven 项目配置,点击 “Auto Import” 或 “Import Maven Projects” 即可完成项目导入。如果使用 Eclipse,打开 Eclipse,点击 “File” -> “Import”,选择 “Existing Maven Projects”,点击 “Next”,然后选择解压后的项目目录,点击 “Finish” 即可导入项目。

项目导入成功后,在开发工具中可以看到项目的目录结构。其中,src/main/java目录用于存放 Java 源代码,src/main/resources目录用于存放配置文件,如application.properties或application.yml,src/test目录用于存放测试代码,pom.xml文件是 Maven 的项目配置文件,用于管理项目的依赖和构建信息。至此,一个基本的 Spring Boot 项目创建完成,可以开始进行与 RabbitMQ 的集成开发了。

    相关文章:

    Spring Boot 与 RabbitMQ 的深度集成实践(一)

    引言 ** 在当今的分布式系统架构中,随着业务复杂度的不断提升以及系统规模的持续扩张,如何实现系统组件之间高效、可靠的通信成为了关键问题。消息队列作为一种重要的中间件技术,应运而生并发挥着举足轻重的作用。 消息队列的核心价值在于其…...

    Android动态音频柱状图可视化解析:从原理到实现

    Android动态音频柱状图可视化解析:从原理到实现 一、整体架构设计二、核心组件设计三、核心代码实现四、交互设计与用户体验五、性能优化与问题解决一、整体架构设计 Android动态音频柱状图可视化解析 在移动应用开发中,音频可视化是增强用户体验的重要手段。无论是音乐播放器…...

    vue3大事件项目

    这周写完了vue3的大事件项目,从中学到了很多东西,并且解決了一部分bug,現在就和大家分享一下我遇到的问题并且是如何解決的 1. QuillEditor 的 v-model 用法错误 先讲一下quilleditor富文本的基本使用方法: 1.安裝quill依賴&am…...

    MapReduce-WordCount实现按照value降序排序、字符小写、识别不同标点

    要求: 输入文件的按照空格、逗号、点号、双引号等分词 输入文件的大写字母全部换成小写 文件输出要求按照value值降序排序 Hadoop给的wordcount示例代码以及代码理解 基于map reduce的word count个人理解:输入的文件经过map reduce框架处理后&#…...

    c++线段树之单点修改区间最大子段和-----P4513 小白逛公园

    题目大意 单点修改查询区间最大字段和 解题思路 如果线段树节点存储的是‘区间最大子段和’,如何合并? 简单的加法或求极值都不行,仔细分析可得,父节点最大字段和可能为: 左子树最大子段和右子树最大子段和左子树最…...

    [Java实战]Spring Boot整合Elasticsearch(二十六)

    [Java实战]Spring Boot整合Elasticsearch(二十六) 摘要:本文通过完整的实战演示,详细讲解如何在Spring Boot项目中整合Elasticsearch,实现数据的存储、检索和复杂查询功能。包含版本适配方案、Spring Data Elasticsea…...

    【深度学习新浪潮】大模型在哪些垂域已经有比较好的落地?

    AI大模型在多个垂直领域已实现显著落地,以下结合可验证案例与行业数据展开说明: 一、医疗健康:精准诊断与个性化治疗 呼吸系统疾病诊断 国家呼吸医学中心研发的LungDiag模型,基于公开临床数据集训练,在预印本研究中对肺炎、肺癌等10种疾病的辅助诊断准确率达92%。医联Med…...

    软件测试全攻略:从概念到实践

    目录 测试指南针--概念篇 1. 什么是软件测试? 2. 软件测试和软件开发的关系是什么? 3. 测试需要哪些能力? 4. 测试流程是什么样的? 5. 什么是单元测试和集成测试? 6. 软件的生命周期是什么样的? 需求…...

    linux hungtask detect机制分析

    1,机制概述‌ hungtask detect 是 Linux 内核用于检测长时间阻塞("hung")任务的机制,主要针对因死锁、死循环或资源竞争导致无法调度的任务 ‌触发条件‌:任务在 TASK_UNINTERRUPTIBLE 状态持续超过预设阈值…...

    影刀处理 Excel:智能工具带来的高效变革

    1. 高效的数据处理能力 1.1 快速读取与写入数据 影刀在处理 Excel 数据时展现出显著的读取与写入速度优势。传统方法处理大型 Excel 文件时,读取速度可能仅为每秒 100 行左右,而影刀通过优化底层代码和采用高效的文件解析算法,读取速度可达…...

    2021ICPC四川省赛个人补题ABDHKLM

    Dashboard - The 2021 Sichuan Provincial Collegiate Programming Contest - Codeforces 过题难度: A K D M H B L 铜奖 5 594 银奖 6 368 金奖 8 755 codeforces.com/gym/103117/problem/A 模拟出牌的过程,打表即可 // Code Start Here int t…...

    HarmonyOS 影视应用APP开发--配套的后台服务go-imovie项目介绍及使用

    网上有小伙伴对影视应用感兴趣,也想搞个自己的免费观影APP玩玩儿。前期博主开源的有uniapp版本和harmonyOS原生版本影视客户端,但是对博主开源的这个影视后台接口服务不太了解,不知道怎么用起来。这里总结介绍下该go-imove后台接口服务项目介…...

    JAVA SE 多线程(上)

    文章目录 📕1. Thread类及常见方法✏️1.1 创建线程✏️1.2 Thread 的常见构造方法✏️1.3 Thread 的几个常见属性✏️1.4 启动一个线程---start()✏️1.5 中断一个线程---interrupt()✏️1.6 等待一个线程---join()✏️1.7 获取当前线程引用✏️1.8 休眠当前线程 &…...

    基于Bootstrap 的网页html css 登录页制作成品

    目录 前言 一、网页制作概述 二、登录页面 2.1 HTML内容 2.2 CSS样式 三、技术说明书 四、页面效果图 前言 ‌Bootstrap‌是一个用于快速开发Web应用程序和网站的前端框架,由Twitter的设计师Mark Otto和Jacob Thornton合作开发。 它基于HTML、CSS和JavaScri…...

    AUTOSAR图解==>AUTOSAR_SRS_Transformer

    AUTOSAR Transformer 详解 基于AUTOSAR标准的Transformer组件技术解析 目录 1. AUTOSAR Transformer 概述 1.1 Transformer的作用1.2 Transformer在AUTOSAR中的位置2. Transformer架构设计 2.1 整体架构2.2 类结构设计2.3 交互流程3. Transformer类型与实现 3.1 SOME/IP Transf…...

    iOS APP启动页及广告页的实现

    iOS APP启动页及广告页的实现涉及UI布局、数据加载、倒计时控制、广告跳转等多个关键环节。以下是我的一些使用心得: 1. UI实现方案 双Window方案 原理:同时创建两个Window,主Window位于底层,广告Window覆盖在其上。通过切换mak…...

    图绘Linux:基础指令脉络阁

    目录 Linux命令行介绍 目录操作 ls 目录所含文件信息 ls 常用选项 pwd 在那个目录下 cd 进入目录 mkdir 创建目录 文件操作 touch 创建普通文件 echo向文件写入 cat 输出文件内容 cp 拷贝文件/目录 mv剪切重命名 rm 删除文件/目录 查找 * 匹配符 man 查找指令 …...

    数字格式化库 accounting.js的使用说明

    accounting.js 是一个用于格式化数字、货币和金额的轻量级库,特别适合财务和会计应用。以下是其详细使用说明: 安装与引入 通过 npm 安装: bash 复制 下载 npm install accounting 引入: javascript 复制 下载 const accounting …...

    ngx_http_proxy_protocol_vendor_module 模块

    一、前置要求 启用 PROXY 协议 在 listen 指令中添加 proxy_protocol 参数,例如: server {listen 80 proxy_protocol;listen 443 ssl proxy_protocol;… }商业订阅 本模块仅在 Nginx 商业版中提供。 二、示例配置 http {# 将 GCP 的 PSC 连接 ID 添…...

    C++11-(2)

    文章目录 (一)C11新增功能1.1 引用折叠1.1.1 在模板中使用引用折叠的场景1.1.2 引用折叠是如何实现的 1.2 完美转发1.3 lambda表达式语法1.3.1 定义1.3.2 lambda的使用场景1.3.3 捕捉列表1.3.4 mutable语法1.3.5 lambda的原理 (一&#xff09…...

    LeetCode算 法 实 战 - - - 双 指 针 与 移 除 元 素、快 慢 指 针 与 删 除 有 序 数 组 中 的 重 复 项

    LeetCode算 法 实 战 - - - 双 指 针 与 移 除 元 素、快 慢 指 针 与 删 除 有 序 数 组 中 的 重 复 项 第 一 题 - - - 移 除 元 素方 法 一 - - - 双 重 循 环方 法 二 - - - 双 指 针方 法 三 - - - 相 向 双 指 针(面 对 面 移 动) 第 二 题 - - -…...

    QT6 源(106):阅读与注释重要的基类控件 QWidget,这是其精简版,完整注释版为篇 37

    (1)原篇幅 37 为最开始整理,整理的不是太完善。重点不突出。故重新整理,但删除了大量的注释,重在突出本 QWidget类的内部逻辑,更易观察其包含了哪些内容。至于不理解的成员函数与属性,内容已不太…...

    【Bluedroid】蓝牙HID DEVICE错误报告处理全流程源码解析

    本文基于Android蓝牙协议栈代码,深入解析HID设备在接收非法指令(如无效的SET_REPORT)时的错误处理全流程,涵盖错误映射、协议封装、传输控制三大核心模块。重点剖析以下机制: HID协议规范错误码的动态转换策略 控制通…...

    Day29 类的装饰器

    类也有修饰器,他的逻辑类似:接收一个类,返回一个修改后的类。例如 添加新的方法或属性(如示例中的 log 方法)。修改原有方法(如替换 init 方法,添加日志)。甚至可以返回一个全新的类…...

    学习黑客Active Directory 入门指南(二)

    Active Directory 入门指南(二):深入逻辑结构与物理组件 🌳🏢 大家好!欢迎回到 “Active Directory 入门指南” 系列的第二篇。在上一篇中,我们初步认识了Active Directory,了解了其…...

    为什么el-select组件在下拉选择后无法赋值

    为什么el-select组件在下拉选择后无法赋值 https://blog.csdn.net/ZHENGCHUNJUN/article/details/127325558 这个链接解决了大模型无法解决的问题 大模型能够写基础且高级一些的代码,但是遇到再深入一些的问题,还是得问百度。对于我这种小白来说问题原因…...

    FreeRTOS的学习记录(临界区保护,调度器挂起与恢复)

    临界区 在 FreeRTOS 中,临界区(Critical Section) 是指程序中一段必须以原子方式执行的代码区域,在此区域内不允许发生任务切换或中断干扰,以保护共享资源或执行关键操作。FreeRTOS 提供了多种机制来实现临界区&#…...

    给个人程序加上MCP翅膀

    背景 最近MCP这个词真是到处都是,看起来特别高大上。我平时没事的时候也一直在关注这方面的技术,知道它是怎么一回事,也懂该怎么去实现。但可惜一直抽不出时间来自己动手搞一个MCP服务。网上关于MCP的教程一搜一大把,但基本上都是…...

    2023年河南CCPC(ABCEFHK)

    文章目录 2023河南CCPCA. 小水獭游河南(字符串)B. Art for Rest(数组切割)C. Toxel与随机数生成器(水)E. 矩阵游戏(dp)F. Art for Last(区间最小差分)H. Travel Begins(数学思维)K. 排列与质数(规律)总结 2023河南CCPC A. 小水獭…...

    【 Redis | 实战篇 秒杀优化 】

    目录 前言: 1.分布式锁 1.1.分布式锁的原理与方案 1.2.Redis的String结构实现分布式锁 1.3.锁误删问题 1.4.锁的原子性操作问题 1.5.Lua脚本解决原子性问题 1.6.基于String实现分布式锁存在的问题 1.7.Redisson分布式锁 2.秒杀优化 3.秒杀的异步优化 3.1…...

    【Spring】核心机制:IOC与DI深度解析

    目录 1.前言 2.正文 2.1三层架构 2.2Spring核心思想(IOC与AOP) 2.3两类注解:组件标识与配置 2.3.1五大类注解 2.3.1.1Controller 2.3.1.2Service 2.3.1.3Repository 2.3.1.4Configuration 2.3.1.5Component 2.3.2方法注解&#x…...

    1-机器学习的基本概念

    文章目录 一、机器学习的步骤Step1 - Function with unknownStep2 - Define Loss from Training DataStep3 - Optimization 二、机器学习的改进Q1 - 线性模型有一些缺点Q2 - 重新诠释机器学习的三步Q3 - 机器学习的扩展Q4 - 过拟合问题(Overfitting) 一、…...

    ARM A64 STR指令

    ARM A64 STR指令 1 STR (immediate)1.1 Post-index1.1.1 32-bit variant1.1.2 64-bit variant 1.2 Pre-index1.2.1 32-bit variant1.2.2 64-bit variant 1.3 Unsigned offset1.3.1 32-bit variant1.3.2 64-bit variant 1.4 Assembler symbols 2 STR (register)2.1 32-bit varia…...

    虚幻引擎5-Unreal Engine笔记之`GameMode`、`关卡(Level)` 和 `关卡蓝图(Level Blueprint)`的关系

    虚幻引擎5-Unreal Engine笔记之GameMode、关卡(Level) 和 关卡蓝图(Level Blueprint)的关系 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之GameMode、关卡(Level) 和 关卡蓝图(Level B…...

    软件工具:批量图片区域识别+重命名文件的方法,发票识别和区域选择方法参考,基于阿里云实现

    基于阿里云的批量图片区域识别与重命名解决方案 图像识别重命名 应用场景 ​​企业档案管理​​:批量处理扫描的合同、文件等图片,根据合同编号、文件标题等关键信息重命名文件​​医疗影像处理​​:识别X光、CT等医学影像中的患者ID、检查日…...

    .NET外挂系列:1. harmony 基本原理和骨架分析

    一:背景 1. 讲故事 为什么要开这么一个系列,是因为他可以对 .NET SDK 中的方法进行外挂,这种技术对解决程序的一些疑难杂症特别有用,在.NET高级调试 领域下大显神威,在我的训练营里也是花了一些篇幅来说这个&#xf…...

    深入理解位图(Bit - set):概念、实现与应用

    目录 引言 一、位图概念 (一)基本原理 (二)适用场景 二、位图的实现(C 代码示例) 三、位图应用 1. 快速查找某个数据是否在一个集合中 2. 排序 去重 3. 求两个集合的交集、并集等 4. 操作系…...

    React Flow 边事件处理实战:鼠标事件、键盘操作及连接规则设置(附完整代码)

    本文为《React Agent:从零开始构建 AI 智能体》专栏系列文章。 专栏地址:https://blog.csdn.net/suiyingy/category_12933485.html。项目地址:https://gitee.com/fgai/react-agent(含完整代码示​例与实战源)。完整介绍…...

    【计算机网络】第一章:计算机网络体系结构

    本篇笔记课程来源:王道计算机考研 计算机网络 【计算机网络】第一章:计算机网络体系结构 一、计算机网络的概念1. 理论2. 计算机网络、互连网、互联网的区别 二、计算机网络的组成、功能1. 组成2. 功能 三、交换技术1. 电路交换2. 报文交换3. 分组交换4.…...

    实战设计模式之状态模式

    概述 作为一种行为设计模式,状态模式允许对象在其内部状态改变时,改变其行为。这种模式通过将状态逻辑从对象中分离出来,并封装到独立的状态类中来实现。每个状态类代表一种特定的状态,拥有自己的一套行为方法。当对象的状态发生变…...

    [C++入门]类和对象中(2)日期计算器的实现

    目录 一、运算符重载 1、格式 2、简单举例 2、前置,后置 3、日期生成器的实现 1、声明与定义 1、友元函数 2、print函数 3、运算符重载 4、GetMonthDay 5、,-,,-的实现 6、重载流操作符 2、实现 3、定义源码 一、运算…...

    数据质量问题的形成与解决

    在数字化时代,数据已成为企业和组织发展的核心资产,数据质量的高低直接影响着决策的准确性、业务的高效性以及系统的稳定性。然而,数据质量问题频发,严重阻碍了数据价值的充分发挥。 一、数据质量问题的成因分析 1.信息因素 元数…...

    论文阅读(四):Agglomerative Transformer for Human-Object Interaction Detection

    论文来源:ICCV(2023) 项目地址:https://github.com/six6607/AGER.git 1.研究背景 人机交互(HOI)检测需要同时定位人与物体对并识别其交互关系,核心挑战在于区分相似交互的细微视觉差异&#…...

    【机器学习】工具入门:飞牛启动Dify Ollama Deepseek

    很久没有更新文章了,最近正好需要研究一些机器学习的东西,打算研究一下 difyOllama 以下是基于FN 的dify本地化部署,当然这也可能是全网唯一的飞牛部署dify手册 部署 官方手册:https://docs.dify.ai/en/getting-started/install-self-hos…...

    课外活动:再次理解页面实例化PO对象的魔法方法__getattr__

    课外活动:再次理解页面实例化PO对象的魔法方法__getattr__ 一、动态属性访问机制解析 1.1 核心实现原理 class Page:def __getattr__(self, loc):"""魔法方法拦截未定义属性访问"""if loc not in self.locators.keys():raise Exce…...

    面试题总结二

    1.mybatis三个范式 第一范式:表中字段不能再分,每行数据都是唯一的第二范式:满足第一范式,非主键字段只依赖于主键第三范式:满足第二范式,非主键字段没有传递依赖 2.MySQL数据库引擎有哪些 InnoDB&#…...

    代码随想录算法训练营第六十六天| 图论11—卡码网97. 小明逛公园,127. 骑士的攻击

    继续补,又是两个新算法,继续进行勉强理解,也是训练营最后一天了,六十多天的刷题告一段落了! 97. 小明逛公园 97. 小明逛公园 感觉还是有点难理解原理 Floyd 算法对边的权值正负没有要求,都可以处理。核心…...

    编程技能:字符串函数07,strncat

    专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:编程技能:字符串函数06,strcat 回到目录…...

    [Java实战]Spring Boot整合RabbitMQ:实现异步通信与消息确认机制(二十七)

    [Java实战]Spring Boot整合RabbitMQ:实现异步通信与消息确认机制(二十七) 摘要:本文通过完整案例演示Spring Boot与RabbitMQ的整合过程,深入讲解异步通信原理与消息可靠性保证机制。包含交换机类型选择、消息持久化配…...

    数据库中关于查询选课问题的解法

    前言 今天上午起来复习了老师上课讲的选课问题。我总结了三个解法以及一点注意事项。 选课问题介绍 简单来说就是查询某某同学没有选或者选了什么课。然后查询出该同学的姓名,学号,课程号,课程名之类的。 sql文件我上传了。大家可以尝试练…...