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

C++ - 仿 RabbitMQ 实现消息队列(1)(环境搭建)

C++ - 仿 RabbitMQ 实现消息队列(1)(环境搭建)

  • 什么是消息队列
      • 核心特点
      • 核心组件
      • 工作原理
      • 常见消息队列实现
      • 应用场景
      • 优缺点
  • 项目配置
    • 开发环境
    • 技术选型
  • 更换软件源
  • 安装一些工具
    • 安装epel 软件源
    • 安装 lrzsz 传输工具
    • 安装git
    • 安装 cmake
    • 安装 SQLite3
    • 安装GTest
  • 安装高版本 gcc/g++编译器
      • 1. 确认可用的 GCC 工具集版本
      • 2. 安装默认的 GCC 工具集
      • 3. 正确的启用方式
      • 4. 永久启用(可选)
  • 安装Protobuf
      • 1. 解压源码包
      • 2. 进入源码目录
      • 3. 生成配置脚本
      • 4. 配置编译选项
      • 5. 编译源码
      • 6. 安装到系统
      • 7. 更新动态库缓存
      • 完整流程总结
      • 验证安装
  • 安装 Muduo

我们今天来开一个新的项目仿 RabbitMQ 实现消息队列,这个项目更加接近公司的开发流程,开发和测试各个方面都会涉及到。不过在这之前,我们先来了解一下什么是消息队列,消息队列是用来干嘛的。

什么是消息队列

消息队列(Message Queue)是一种用于在分布式系统或应用程序之间传递消息的通信机制,它通过一个中间存储结构(队列)来管理消息的传递,允许发送方和接收方以异步的方式交互。消息队列的核心作用是解耦生产者和消费者,提升系统的可扩展性、可靠性和性能。

核心特点

  1. 解耦性
    生产者(发送方)和消费者(接收方)无需直接通信,也无需知道彼此的存在。双方通过消息队列进行交互,降低了系统间的耦合度。

  2. 异步通信
    生产者将消息发送到队列后,无需等待消费者立即处理,可以继续执行其他任务。消费者可以按自己的节奏处理消息,提高系统响应速度。

  3. 削峰填谷
    在流量高峰时,消息队列可以缓冲大量请求,避免系统过载。消费者可以逐步处理队列中的消息,平稳系统负载。

  4. 可靠性
    消息队列通常提供持久化存储,即使消费者崩溃或网络中断,消息也不会丢失,确保数据不丢失。

核心组件

  1. 生产者(Producer)
    负责生成消息并将其发送到消息队列中。

  2. 消息队列(Message Queue)
    中间存储结构,用于临时存储消息,支持消息的持久化、排序和分发。

  3. 消费者(Consumer)
    从消息队列中获取消息并进行处理。

工作原理

  1. 生产者发送消息:生产者将消息发送到指定的队列中。
  2. 消息存储:消息队列将消息持久化存储,等待消费者处理。
  3. 消费者拉取或推送消息:消费者从队列中获取消息(拉取模式)或通过订阅机制接收消息(推送模式)。
  4. 消息处理:消费者处理消息,并可能返回处理结果。
  5. 消息确认(可选):消费者处理完成后,向消息队列发送确认信号,队列可以删除或标记消息为已处理。

常见消息队列实现

  1. RabbitMQ

    • 基于AMQP协议的开源消息代理,支持多种消息模式(如发布/订阅、路由、主题)。
    • 适合需要灵活路由和复杂消息模式的场景。
  2. Kafka

    • 高吞吐量的分布式消息系统,常用于大数据和实时流处理。
    • 支持持久化日志、分区和副本,适合大规模数据处理。
  3. ActiveMQ

    • 基于JMS规范的开源消息代理,支持多种协议(如AMQP、STOMP、MQTT)。
    • 适合企业级应用和集成场景。
  4. Redis Stream

    • Redis 5.0引入的流数据结构,支持简单的消息队列功能。
    • 适合轻量级、低延迟的场景。
  5. Amazon SQS/Azure Service Bus

    • 云服务提供商提供的托管消息队列服务,适合云原生应用。

应用场景

  1. 异步任务处理
    例如:用户注册后发送欢迎邮件、订单处理后更新库存。

  2. 应用解耦
    例如:电商系统中,订单服务、支付服务和物流服务通过消息队列解耦。

  3. 流量削峰
    例如:秒杀活动中,将用户请求暂存到消息队列,后台服务逐步处理。

  4. 日志处理
    例如:将应用日志发送到消息队列,由日志收集服务统一处理。

  5. 事件驱动架构
    例如:微服务架构中,服务之间通过事件消息进行通信。

优缺点

优点

  • 解耦生产者和消费者,降低系统复杂度。
  • 支持异步通信,提高系统响应速度。
  • 提供削峰填谷能力,增强系统稳定性。
  • 支持消息持久化,确保数据不丢失。

缺点

  • 引入了额外的组件,增加了系统复杂度。
  • 消息顺序和重复消费等问题需要额外处理。
  • 消息队列本身可能成为性能瓶颈(需合理设计)。

我们这次的项目围绕着RabbitMQ 模拟实现一个简单的消息队列

项目配置

开发环境

组件版本/工具
操作系统CentOS9 / Ubuntu-22.04
代码编辑器VSCode / Vim
编译调试工具g++ / gdb
构建工具Makefile

技术选型

类别选择
开发主语言C++
序列化框架Protobuf 二进制序列化
网络通信方案自定义应用层协议 + muduo库(推荐,适用于TCP长连接及高并发场景)
或者自定义应用层协议 + 原生socket(复杂度较高)
数据库SQLite3
单元测试框架Gtest

更换软件源

首先,我们得要首先把软件源换成国内的,如果使用系统本身的软件源,就要访问国外的网站,速度会非常慢。

我们换成清华大学的镜像源:

https://mirrors.tuna.tsinghua.edu.cn/

在这里插入图片描述
执行以下的代码:

sudo tee /etc/yum.repos.d/CentOS-Stream.repo << 'EOF'
[baseos]
name=CentOS Stream 9 - BaseOS (Tsinghua)
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-stream/9-stream/BaseOS/x86_64/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial[appstream]
name=CentOS Stream 9 - AppStream (Tsinghua)
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-stream/9-stream/AppStream/x86_64/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial[extras]
name=CentOS Stream 9 - Extras (Tsinghua)
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-stream/SIGs/9-stream/extras/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
EOF

这段代码是在配置 CentOS Stream 9 的 YUM 软件仓库(repository),具体作用如下:

  1. 使用 sudo tee 命令将后面的内容写入 /etc/yum.repos.d/CentOS-Stream.repo 文件(需要管理员权限)
  2. << 'EOF' 表示将后续内容作为标准输入,直到遇到 EOF 结束标记
  3. 文件内容配置了三个软件源仓库:
    • [baseos]:基础操作系统软件包
    • [appstream]:应用程序包
    • [extras]:额外软件包

每个仓库配置包含:

  • name:仓库描述名称(标明是清华镜像源)
  • baseurl:指定软件包的下载地址(使用清华大学开源镜像站)
  • gpgcheck=1:启用 GPG 签名验证
  • gpgkey:指定 GPG 密钥位置用于验证软件包

这样配置后,当你使用 yumdnf 命令安装软件时,系统会从清华大学的镜像站点下载 CentOS Stream 9 的软件包,速度会比官方源更快(特别是在中国境内)。

注意:这段代码会覆盖同名的现有仓库配置文件,如果之前有其他配置会被替换。

大家注意一下三个部分的baseurl,如果路径不对,是会失败的,这里给大家指明一下路径:

baseos的baseurl:

https://mirrors.tuna.tsinghua.edu.cn/centos-stream/9-stream/BaseOS/x86_64/

在这里插入图片描述
appstream的baseurl:

https://mirrors.tuna.tsinghua.edu.cn/centos-stream/9-stream/AppStream/x86_64/os/

在这里插入图片描述
extras的baseurl:

https://mirrors.tuna.tsinghua.edu.cn/centos-stream/SIGs/9-stream/extras/x86_64/

在这里插入图片描述

安装一些工具

安装epel 软件源

sudo dnf install epel-release

安装 lrzsz 传输工具

sudo dnf install lrzsz

在这里插入图片描述

安装git

sudo dnf install git

在这里插入图片描述
在这里插入图片描述

安装 cmake

sudo dnf install cmake

在这里插入图片描述

安装 SQLite3

sudo dnf install sqlite-devel

在这里插入图片描述

安装GTest

sudo dnf install gtest gtest-devel
ls /usr/include/gtest/gtest.h

在这里插入图片描述

安装高版本 gcc/g++编译器

在 CentOS Stream 9 中,gcc-toolset-11 可能不再直接提供,或者它的包名称/仓库配置发生了变化。以下是解决方案:


1. 确认可用的 GCC 工具集版本

运行以下命令查看当前可用的 GCC 相关包:

dnf search gcc-toolset

在这里插入图片描述
我们这里选择12版本

2. 安装默认的 GCC 工具集

CentOS Stream 9 可能默认提供 GCC Toolset 12 或更高版本:

sudo dnf install gcc-toolset-12

3. 正确的启用方式

在 CentOS Stream 9 中,gcc-toolset-12 不再通过 module load 启用,而是通过 直接加载环境变量

source /opt/rh/gcc-toolset-12/enable

然后验证 GCC 版本:

gcc --version

在这里插入图片描述

4. 永久启用(可选)

如果希望每次登录自动启用,可以将以下内容添加到 ~/.bashrc

echo 'source /opt/rh/gcc-toolset-12/enable' >> ~/.bashrc
source ~/.bashrc

安装Protobuf

这里建议大家先在windows上下好了传到Linux上:
在这里插入图片描述

下载链接(如果有VPN,可以开一个,下得快):

https://github.com/protocolbuffers/protobuf/releases/download/v3.2
0.2/protobuf-all-3.20.2.tar.gz

在这里插入图片描述
然后执行以下代码:

tar -xzf protobuf-all-21.12.tar.gz
cd protobuf-21.12
./autogen.sh
./configure
make -j$(nproc)
sudo make install
sudo ldconfig

这段代码是用于从源码编译并安装 Protocol Buffers (Protobuf) 的完整流程。Protobuf 是 Google 开发的一种高效的数据序列化格式,广泛用于网络通信和数据存储。以下是每一步的详细解释:


1. 解压源码包

tar -xzf protobuf-all-21.12.tar.gz
  • 作用:解压名为 protobuf-all-21.12.tar.gz 的压缩包。
  • 参数说明
    • -x:解压文件。
    • -z:使用 gzip 解压(针对 .tar.gz 文件)。
    • -f:指定文件名。
  • 结果:生成 protobuf-21.12 目录,包含 Protobuf 的源码。

2. 进入源码目录

cd protobuf-21.12
  • 作用:切换到解压后的 Protobuf 源码目录,准备进行编译。

3. 生成配置脚本

./autogen.sh
  • 作用:运行 autogen.sh 脚本,生成 configure 文件(如果源码包未提供预生成的 configure 文件)。
  • 适用场景
    某些开源项目(如 Protobuf)使用 autotools 构建系统,需要先运行 autogen.sh 生成 configure 脚本。

4. 配置编译选项

./configure
  • 作用:运行 configure 脚本,检测系统环境(如编译器、库路径等),并生成 Makefile
  • 关键行为
    • 检查系统是否安装了必要的依赖(如 g++makelibtool 等)。
    • 生成针对当前系统的编译配置(如优化选项、安装路径等)。
  • 自定义选项
    可以通过参数指定安装路径(如 ./configure --prefix=/usr/local/protobuf)。

5. 编译源码

make -j$(nproc)
  • 作用:使用 make 编译 Protobuf 源码。
  • 参数说明
    • -j$(nproc):启用多线程编译,$(nproc) 自动获取 CPU 核心数,加速编译过程。
  • 结果:生成可执行文件和库(如 protoc 编译器、libprotobuf.so 等)。

6. 安装到系统

sudo make install
  • 作用:将编译好的 Protobuf 文件安装到系统目录(如 /usr/local/bin/usr/local/lib)。
  • 权限要求:需要 sudo 权限,因为安装到系统目录需要管理员权限。
  • 安装内容
    • 可执行文件(如 protoc)安装到 /usr/local/bin
    • 库文件(如 libprotobuf.*)安装到 /usr/local/lib
    • 头文件安装到 /usr/local/include

7. 更新动态库缓存

sudo ldconfig
  • 作用:更新系统的动态库缓存,使新安装的 Protobuf 库(libprotobuf.so)能被系统识别。
  • 必要性
    如果不运行 ldconfig,程序在运行时可能找不到新安装的库,导致报错(如 libprotobuf.so: cannot open shared object file)。

完整流程总结

  1. 解压源码tar -xzf protobuf-all-21.12.tar.gz
  2. 进入目录cd protobuf-21.12
  3. 生成配置脚本./autogen.sh
  4. 配置环境./configure
  5. 编译代码make -j$(nproc)
  6. 安装到系统sudo make install
  7. 更新库缓存sudo ldconfig

验证安装

安装完成后,可以通过以下命令验证 Protobuf 是否安装成功:

protoc --version  # 检查 protoc 版本

如果输出版本号(如 libprotoc 3.21.12),则安装成功。

安装 Muduo

先获取一下zip包:

wget https://gitee.com/hansionz/mq/raw/master/resource/muduo-master.zip

在这里插入图片描述

unzip muduo-master.zip
cd muduo-master

Muduo 需要以下依赖:

sudo dnf install -y gcc-c++ cmake make \boost-devel openssl-devel protobuf-devel \zlib-devel curl-devel

然后进行编译

# 进入 Muduo 源码目录
cd muduo-master# 使用 CMake 构建
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..  # 推荐 Release 模式
make -j$(nproc)  # 并行编译

最后进行安装:

sudo make install

在这里插入图片描述

然后进入到bin目录我们可以来测试一下:
在这里插入图片描述
执行:

./protobuf_server 9091

在这里插入图片描述
然后复制SSH渠道,执行:

./protobuf_client 0.0.0.0 9091

在这里插入图片描述

相关文章:

C++ - 仿 RabbitMQ 实现消息队列(1)(环境搭建)

C - 仿 RabbitMQ 实现消息队列&#xff08;1&#xff09;&#xff08;环境搭建&#xff09; 什么是消息队列核心特点核心组件工作原理常见消息队列实现应用场景优缺点 项目配置开发环境技术选型 更换软件源安装一些工具安装epel 软件源安装 lrzsz 传输工具安装git安装 cmake安装…...

多模态核心模型

1.BLIP的原理? BLIP是一种统一视觉语言理解和生成的预训练模型。BLIP的特点在于它采用了一种编码器-解码器混合架构&#xff08;MED)&#xff0c;并且引入了CapFilt机制来提高数据质量和模型性能。BLIP的主要组成部分包括&#xff1a; MED架构&#xff1a;包括单模态编码器、…...

Kubernetes笔记(1)Kubernetes入门

Kubernetes入门 一、容器技术二、Kubernetes介绍1. Kubernetes核心资源2. Kubernetes集群架构2.1 Master2.2 Node 一、容器技术 随着技术发展&#xff0c;应用程序的部署经历了从物理机到虚拟机&#xff0c;再到容器的转变。 物理机&#xff1a;物理机会运行多个程序&#xf…...

【coze】意图识别(售前售后问题、搜索引擎去广告)

【coze】&#xff08;售前售后问题、搜索引擎去广告&#xff09; 1、创建意图识别工作流&#xff08;1&#xff09;创建工作流&#xff08;2&#xff09;添加意图识别节点&#xff08;3&#xff09;配置意图识别节点&#xff08;4&#xff09;运行看效果&#xff08;5&#xff…...

Vue3 中用 canvas 封装抽奖转盘组件:设定中奖概率及奖项图标和名称

在 Web 应用开发中&#xff0c;抽奖功能是提升用户参与度的常用手段。使用 Vue3 结合 canvas 技术&#xff0c;我们可以轻松实现一个高度自定义的抽奖转盘组件&#xff0c;不仅能设定中奖概率&#xff0c;还能灵活配置奖项图标和名称。本文将详细介绍该组件的实现原理、步骤&am…...

vue3+vite+AI大模型实现谷歌插件-web诊断

vue3viteAI大模型实现谷歌插件-web诊断 一、前言二、实现思路1、功模块构图2、数据交互图 三、技术栈简介1、Web端2、服务端 四、主要功能实现1、Web端【1】谷歌插件vue全局配置文件【2】加载web诊断工具至当前页面【3】全局捕获异常错误 2、Server端【1】websock管理模块【2】…...

高频PCB设计如何选择PCB层数?

以四层板为例&#xff0c;可以第一层和第二层画信号&#xff0c;作为信号层。 第三层可以走电源&#xff0c;然后第四层走GND 但是更可以第一层和第三层画信号。第二层可以走电源&#xff0c;然后第四层走GND 用中间的电源层以及地层可以起到屏蔽的作用&#xff0c;有效降低寄…...

第100+40步 ChatGPT学习:R语言实现多轮建模

回顾一下什么叫多轮建模&#xff1a; 要综合判断一个模型好不好&#xff0c;一次随机抽样是不行的&#xff0c;得多次抽样建模&#xff0c;看看整体的性能如何才行&#xff08;特别是对于这种小训练集&#xff09;。 所以我的思路是&#xff0c;随机抽取训练集和验证集2000次…...

DolphinScheduler-3.2.0集群部署教程

详见&#xff1a; DolphinScheduler-3.2.0集群部署教程Centos7 DolphinScheduler集群部署...

如何设计Kafka的高可用跨机房容灾方案?(需要实战,未实战,纯理论)

1. 双活多中心架构设计 startuml 机房A <--> [Kafka Cluster A] : 万兆光纤 机房B <--> [Kafka Cluster B] : 专线网络 机房C <--> [Kafka Cluster C] : VPN隧道[Kafka Cluster A] <-.-> [Kafka Cluster B] : MirrorMaker2双向镜像 [Kafka Cluster B]…...

[人机交互]协作与通信的设计

零.要点 – 解释协作与通信的含义 – 描述人们在协作与通信中使用的社会机制的主要类型 – 概述存在的各种群件系统 – 讨论学科研究和与社交相关的理论&#xff0c;对设计的启示 一.解释协作与通信的含义 1.1什么是通信 通信是个体之间的信息交换的过程 – 按照所 交换信息的…...

LXwhat-嘉立创

一 电路板简介 什么是PCB? 印刷电路板 什么是SMT? 表面贴装技术 有关电路板的几个专业名词 覆铜腐蚀走线多层板 为什么要画电路板? 杜邦线:接线杂乱、虚接、有可能短路洞洞板:考验焊功(虚焊)、异型元器件不适配自己画板:整齐有序、适配异型元器件、紧凑优雅、有成就感(输…...

决 策 树

1 决策树模型 假如你正在运营一家猫咪领养中心&#xff0c;并拥有一些特征数据&#xff0c;你想训练一个分类器来快速判断一只动物是否为猫。这里有十个训练样本&#xff0c;有关于动物耳朵形状、面部形状、是否有胡须的特征&#xff0c;你想要预测这种动物是否为猫&#xff1…...

ts axios中报 Property ‘code‘ does not exist on type ‘AxiosResponse<any, any>‘

ts语法有严格的格式&#xff0c;如果我们在处理响应数据时&#xff0c;出现了axios响应中非默认字段&#xff0c;就会出现标题那样的警告&#xff0c;我们可以通过创建axios.dt.ts解决这个问题 下面是我在开发中遇到的警告&#xff0c;code并不是axios默认返回的字段&#xff0…...

【AI】用AI将文档、文字一键生成PPT的方法(百度的自由画布版)

前提&#xff1a; 最近看了个书&#xff0c;周末要参加读书会&#xff0c;要分享这本书的内容。一般来说&#xff0c;我都是写好了内容文档&#xff0c;然后在网上找一些模板套上去。 最近发现&#xff0c;有些网站已经可以按照文档&#xff0c;自动生成PPT模板了&#xff0c;里…...

爬虫技术-利用Python和Selenium批量下载动态渲染网页中的标准文本文件

近日工作需要整理信息安全的各项标准文件&#xff0c;这些文件通常发布在在官方网站&#xff0c;供社会各界下载和参考。 这些页面中&#xff0c;标准文本文件常以Word&#xff08;.doc/.docx&#xff09;或PDF格式提供下载。由于文件数量庞大&#xff0c;手动逐条点击下载效率…...

CUDA编程 - 如何在 GPU 上使用 C++ 函数重载 - cppOverload

这里写目录标题 一、完整代码与例程目的二、代码拆解与复用​ 2.1、函数重载​​&#xff1a;​ 2.2、函数指针声明​​&#xff1a;​ 2.3、函数指针赋值与内核启动​​&#xff1a;​ 2.4、CUDA API调用​​&#xff1a;2.4.1、cudaFuncSetCacheConfig&#xff1a;2.4.2、cud…...

AI教你学VUE——Gemini版

前端开发学习路线图 (针对编程新手&#xff0c;主攻 Vue 框架) 总原则&#xff1a;先夯实基础&#xff0c;再深入框架。 想象一下建房子&#xff0c;地基不牢&#xff0c;上面的高楼&#xff08;框架&#xff09;是盖不起来的。HTML、CSS、JavaScript 就是前端的地基。 阶段一…...

力扣热题100,力扣49.字母异位词分组力扣128.最长连续序列力扣.盛水最多的容器力扣42.接雨水(单调栈)

目录 力扣49.字母异位词分组 力扣128.最长连续序列 力扣.盛水最多的容器 力扣42.接雨水(单调栈) 1.包的命名规范: java的命名规范 全部采用小写 结尾不能加负数 声明包: 位置必须在首行 类: 字母数字下划线&#xff0c;美元符号 不能数字开头 不能有中文 不能以关键字命名 区…...

react naive 网络框架源码解析

本文取 react native 两个区别很大的版本做分析&#xff08;0.76.5、0.53.3&#xff09; 一、0.76.5 版fetch 全流程排查 1、JS 端的实现 随手写一个fetch&#xff0c;点开。 我们这里常用的还是手机端&#xff0c;因此选择 react-native&#xff0c;react-native-windows …...

DID在元宇宙的应用爆发:数字身份资产化与跨平台迁移——解析Decentraland等项目的虚拟身份全链路实现

元宇宙的兴起催生了多维度的数字身份需求&#xff0c;但传统虚拟身份系统受限于中心化架构&#xff0c;面临数据孤岛、身份碎片化、资产归属模糊等核心挑战。本文以Decentraland、The Sandbox、Somnium Space等顶级元宇宙平台为研究对象&#xff0c;探讨去中心化身份&#xff0…...

MySQL的内置函数与复杂查询

目录 前言 一、聚合函数 1.1日期函数 1.2字符串函数 1.3数学函数 1.4其它函数 二、关键字周边 2.1关键字的生效顺序 2.2数据源 2.3可以使用聚合函数的关键字 前言 在前面几篇文章中&#xff0c;讲解了有关MySQL数据库、数据库表的创建、数据库表的数据操作等等。本文我…...

mysql中select 1 from的作用

在MySQL中&#xff0c;SELECT 1 FROM ... 是一个常见的SQL写法&#xff0c;通常用于以下场景&#xff1a; 1. 作用与原理 SELECT 1 的本质是返回一个常数值&#xff08;即数字1&#xff09;&#xff0c;且不依赖表中的实际数据。 它的核心作用是快速验证逻辑条件是否成立&…...

Linux中 du (详解)、 df (详解)和 free(详解)以及它们的区别

目录 du命令 df命令 free命令 du/df/free区别 Tree du命令 功能&#xff1a;用于计算文件或目录所占用的磁盘空间大小。它会递归地遍历指定目录下的所有文件和子目录&#xff0c;统计它们占用的磁盘块数&#xff0c;从而得出占用的空间大小。常用选项&#xff1a; -h&…...

ETL交通行业案例丨某大型铁路运输集团ETL数据集成实践

在广袤的祖国边疆&#xff0c;一条条钢铁动脉承载着区域经济发展的重要使命。某大型铁路运输集团作为区域交通枢纽的运营主体&#xff0c;管辖着横跨多个省、区的铁路网络&#xff0c;运营里程超3000公里&#xff0c;每日承载着数以万计的客货运输任务。随着"数字中国&quo…...

【数据挖掘】Apriori算法

Apriori算法是经典的关联规则挖掘算法&#xff0c;用于从事务型数据库中发现频繁项集和强关联规则&#xff0c;特别常用于购物篮分析等场景。 &#x1f9e0; 核心思想&#xff08;Apriori原则&#xff09; 一个项集是频繁的&#xff0c;前提是它的所有子集也必须是频繁的。 即&…...

7.9/Q1,Charls最新文章解读

文章题目&#xff1a;Association between urbanization levels and frailty among middle-aged and older adults in China: evidence from the CHARLS DOI&#xff1a;10.1186/s12916-025-03961-y 中文标题&#xff1a;中国中老年人城市化水平与虚弱程度之间的关联&#xff1…...

从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 7 |TinyML 定位:深度模型在 MCU 上的部署

Part 7 |TinyML 定位:深度模型在 MCU 上的部署 本章聚焦如何在 ESP32-S3 平台上,通过 TinyML 将深度学习模型应用到定位场景,包括特征提取、模型剪枝与量化、TensorFlow Lite for Microcontrollers 部署,以及在线微调与自适应策略。 一、为什么要用 TinyML? 非线性特征挖…...

Codeforces Round 1023 (Div. 2) ABC

链接 Dashboard - Codeforces Round 1023 (Div. 2) - Codeforces A 将数组a分成两组&#xff0c;使得gcd(b) ! gcd(c) 思路 gcd(a,b) < min(a,b) 求数组a的max&#xff0c;min 如果数组a都一样无解 &#xff08;即max min 否则有解&#xff1a;让是max的一组&…...

56. 合并区间

给定若干个区间的集合&#xff0c;将重叠的区间合并后&#xff0c;放入一个数组中返回。 具体思路就是按左端点排序后合并区间&#xff0c;因为按左端点排序后&#xff0c;可以确保每次合并都是以最小元素为合并后区间的起始&#xff0c;并且按左端点排序可以方便合并&#xff…...

Docker安装使用

1.Docker简介 Docker是一个开源的应用容器引擎&#xff1b;是一个轻量级容器技术&#xff1b; Docker支持将软件编译成一个镜像&#xff1b;然后在镜像中各种软件做好配置&#xff0c;将镜像发布出去&#xff0c;其他使用者可以直接使用这个镜像&#xff1b; 运行中的这个镜…...

Linux/AndroidOS中进程间的通信线程间的同步 - POSIX IPC

1 什么是POSIX&#xff1f; POSIX&#xff08;Portable Operating System Interface&#xff09;即可移植操作系统接口&#xff0c;它是IEEE为要在各种UNIX操作系统上运行软件&#xff0c;而定义API的一系列标准的总称。以下为你展开介绍&#xff1a; 产生背景&#xff1a;在…...

5.2创新架构

一、MoE&#xff08;Mixture of Experts&#xff0c;混合专家模型&#xff09; 了解混合专家模型架构&#xff0c;与 Dense 架构相比有什么优劣 是一种提升大模型推理效率和参数利用率的关键技术 核心思想&#xff1a;在模型中增加多个“专家模块”&#xff08;Experts&#x…...

驱动开发系列57 - Linux Graphics QXL显卡驱动代码分析(四)显示区域更新

一&#xff1a;概述 前面在介绍了显示模式设置&#xff08;分辨率&#xff0c;刷新率&#xff09;之后&#xff0c;本文继续分析下&#xff0c;显示区域的绘制&#xff0c;详细看看虚拟机的画面是如何由QXL显卡绘制出来的。 二&#xff1a;相关数据结构介绍 struct qxl_moni…...

疗愈服务预约小程序源码介绍

基于ThinkPHP、FastAdmin和UniApp开发的疗愈服务预约小程序源码&#xff0c;这款小程序在功能设计和用户体验上都表现出色&#xff0c;为疗愈行业提供了一种全新的服务模式。 该小程序源码采用了ThinkPHP作为后端框架&#xff0c;保证了系统的稳定性和高效性。同时&#xff0c…...

力扣118,1920题解

记录 2525.5.6 题目&#xff1a; 思路&#xff1a; 用一个二维数组dp[numRows][numRows]保存每一次动态规划的结果 1.令dp[0][0]1(第一列) 2.找规律 3.得到如下规律(以下情况均为列数大于1) if(col0){ dp[row][col]1 } else { dp[row][col]dp[row-1][col-1]dp[row-1][col] }…...

电池热管理CFD解决方案,为新能源汽车筑安全防线

在全球能源结构加速转型的大背景下&#xff0c;新能源汽车产业异军突起&#xff0c;成为可持续发展的重要驱动力。而作为新能源汽车 “心脏” 的电池系统&#xff0c;其热管理技术的优劣&#xff0c;直接决定了车辆的安全性、续航里程和使用寿命。电池在充放电过程中会产生大量…...

(一)毛子整洁架构(Domain Layer/Repository Pattern/Result Pattern/Error Pattern)

文章目录 项目地址一、整洁架构概念1.1 各个分层的功能1. Domain核心部件2. Application Layer3. Infrastructure layer3. Presenetation layer1.2 项目数据库二、Domain Layer2.1 Apartments 实体1. Current Value Obj2. Money Value Obj3. Apartment 类2.2 User 实体1. User类…...

XSS ..

Web安全中的XSS攻击详细教学&#xff0c;Xss-Labs靶场通关全教程&#xff08;建议收藏&#xff09; - 白小雨 - 博客园跨站脚本攻击&#xff08;XSS&#xff09;主要是攻击者通过注入恶意脚本到网页中&#xff0c;当用户访问该页面时&#xff0c;恶意脚本会在用户的浏览器中执行…...

Github Action部署node项目

Github Action部署node项目 个人学习的时候&#xff0c;作为前端感觉这个CICD基本流程还是有必要了解的&#xff0c;这里记录一下Github Action部署node项目的流程&#xff0c;也算是一个学习的过程 首先肯定是要有一个可运行的node项目 编写部署文件 部署文件放置在.githu…...

高频面试题:设计秒杀系统,用Redis+Lua解决超卖

高频面试题&#xff1a;设计秒杀系统&#xff0c;用RedisLua解决超卖 **1. 问题背景****2. 解决方案&#xff1a;Redis Lua****为什么选择Redis Lua&#xff1f;****核心代码逻辑****Java调用示例&#xff08;Spring Boot&#xff09;** **3. 方案优势****4. 面试回答话术***…...

2、Kafka Replica机制与ISR、HW、LEO、AR、OSR详解

Kafka 作为分布式高可用消息队列&#xff0c;其副本&#xff08;Replica&#xff09;机制是实现高可靠性和数据一致性的核心。本文将系统介绍 Kafka 的 Replica 机制&#xff0c;并详细解释 ISR、HW、LEO、AR、OSR 等关键概念。 一、Kafka Replica机制概述 在分布式系统中&am…...

生成式 AI:从工具革命到智能体觉醒,2025 年的质变与突破

在上海胸科医院的手术室里&#xff0c;一束全息投影正精准勾勒出患者肺部的三维血管模型。主刀医生手持机械臂的瞬间&#xff0c;AI 导航系统已同步完成 200 次路径演算&#xff0c;将毫米级误差控制在 0.3 毫米以内 —— 这个真实发生在 2025 年的临床场景&#xff0c;标志着生…...

安卓基础(拖拽)

当用户长按或拖拽某个视图&#xff08;如按钮、图片&#xff09;时&#xff0c;需要提供视觉反馈&#xff08;即阴影&#xff09;。这行代码通常在拖拽事件的处理逻辑中&#xff0c;例如&#xff1a; view.setOnLongClickListener(v -> {// 创建拖拽阴影DragShadowBuilder …...

IoTDB磁盘I/O性能监控与优化指南

一、磁盘I/O性能观测核心指标 在现代计算机系统中&#xff0c;磁盘I/O性能对整体系统表现至关重要。为有效监控和优化磁盘I/O性能&#xff0c;需关注以下核心指标&#xff1a; ‌I/O读写延迟‌&#xff1a;衡量从发起I/O请求到接收响应的时间间隔。‌IOPS&#xff08;Input/O…...

java每日精进 5.06【框架之功能权限】

0.概述 0.1 整体架构概述 这个RBAC权限系统基于Spring Security和Token认证机制&#xff0c;主要包含以下核心组件&#xff1a; 用户-角色-菜单的多对多关系模型 基于Token的认证流程 细粒度的权限控制&#xff08;菜单权限、按钮权限&#xff09; 灵活的权限配置方式 1…...

静态NAT

实验需求 PC1和PC2通过静态NAT去访问服务器 实验拓扑 图13-1 静态NAT 实验步骤 步骤1&#xff1a;IP地址的配置 PC1的配置 PC2的配置 R1的配置 <Huawei>system-view [Huawei]undo info-center enable [Huawei]sysname R1 [R1]interface g0/0/0 [R1-GigabitEt…...

RabbitMQ-api开发

前言 MQ就是接收并转发消息 核心概念 admin是用户 每个虚拟机上都有多个交换机 快速入门 引入依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.22.0</version></dependen…...

const MachineTree getMachineTree() ; MachineTree getMachineTree() const; 区别?

这两个函数声明在语法和语义上有明显的区别&#xff0c;它们的用途和行为也不同。让我们逐一分析它们的区别&#xff1a; 1. const MachineTree &getMachineTree(); 这个函数声明表示&#xff1a; 返回类型&#xff1a;const MachineTree &&#xff0c;即返回一个 M…...

使用DevTools工具调试前端页面,便捷脚本,鸿蒙调试webView

参考官方文章 便捷脚本 创建文本&#xff0c;复制修改后缀为bat 建立bat文件 echo off setlocal enabledelayedexpansion:: Initialize port number and PID list set PORT9222 set PID_LIST:: Get the list of all forwarded ports and PIDs for /f "tokens2,5 delims…...