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

博客系统-RabbitMQ

前言

RabbitMQ介绍

⽤⼾注册完成之后,系统会给⽤⼾发送⼀封邮件通知
但是邮件发送成功失败并不影响我们⽤⼾注册成功.我们可以采⽤RabbitMQ来进⾏服务的解耦
RabbitMQ是⼀个开源的消息代理和队列服务器,⼴泛⽤于实现消息队列和事件通知.它⽀持多种消息
协议,并且具有⾼可⽤性、灵活的路由、可靠的消息传递和易于使⽤的管理界⾯

MQ( Message queue ),从字⾯意思上看,本质是个队列,FIFO先⼊先出,只不过队列中存放的内容
是消息(message)⽽已.消息可以⾮常简单,⽐如只包含⽂本字符串,JSON等,也可以很复杂,⽐如内嵌对
象.
MQ多⽤于分布式系统之间进⾏通信.
系统之间的调⽤通常有两种⽅式

  1. 同步通信
    直接调⽤对⽅的服务,数据从⼀端发出后⽴即就可以达到另⼀
  2. 异步通信
    数据从⼀端发出后,先进⼊⼀个容器进⾏临时存储,当达到某种条件后,再由这个容器发送给另⼀端.容器的⼀个具体实现就是MQ( message queue )

RabbitMQ 就是MQ的⼀种实现

MQ作用

  1. 异步解耦:在业务流程中,⼀些操作可能⾮常耗时,但并不需要即时返回结果.可以借助MQ把这些操
    作异步化,⽐如⽤⼾注册后发送注册短信或邮件通知,可以作为异步任务处理,⽽不必等待这些操作
    完成后才告知⽤⼾注册成功.
  2. 流量削峰:在访问量剧增的情况下,应⽤仍然需要继续发挥作⽤,但是是这样的突发流量并不常⻅.如
    果以能处理这类峰值为标准⽽投⼊资源,⽆疑是巨⼤的浪费.使⽤MQ能够使关键组件⽀撑突发访问压
    ⼒,不会因为突发流量⽽崩溃.⽐如秒杀或者促销活动,可以使⽤MQ来控制流量,将请求排队,然后系
    统根据⾃⼰的处理能⼒逐步处理这些请求.
  3. 异步通信:在很多时候应⽤不需要⽴即处理消息,MQ提供了异步处理机制,允许应⽤把⼀些消息放⼊MQ中,但并不⽴即处理它,在需要的时候再慢慢处理.
  4. 消息分发:当多个系统需要对同⼀数据做出响应时,可以使⽤MQ进⾏消息分发.⽐如⽀付成功后,⽀
    付系统可以向MQ发送消息,其他系统订阅该消息,⽽⽆需轮询数据库.
  5. 延迟通知:在需要在特定时间后发送通知的场景中,可以使⽤MQ的延迟消息功能,⽐如在电⼦商务平台中,如果⽤⼾下单后⼀定时间内未⽀付,可以使⽤延迟队列在超时后⾃动取消订单

为什么选择RabbitMQ

Kafka
Kafka⼀开始的⽬的就是⽤于⽇志收集和传输,追求⾼吞吐量,性能卓越,单机吞吐达到⼗万级,在⽇
志领域⽐较成熟,功能较为简单,主要⽀持简单的MQ功能,如果有⽇志采集需求,肯定是⾸选kafka
了。
RocketMQ
RocketMQ采⽤Java语⾔开发,由阿⾥巴巴开源,后捐赠给了Apache.
它在设计时借鉴了Kafka,并做出了⼀些⾃⼰的改进,⻘出于蓝⽽胜于蓝,经过多年双⼗⼀的洗礼,在
可⽤性、可靠性以及稳定性等⽅⾯都有出⾊的表现.适合对于可靠性⽐较⾼,且并发⽐较⼤的场景,⽐
如互联⽹⾦融.但⽀持的客⼾端语⾔不多,且社区活跃度⼀般

RabbitMQ
采⽤Erlang语⾔开发,MQ功能⽐较完备,且⼏乎⽀持所有主流语⾔,开源提供的界⾯也⾮常友好,性
能较好,吞吐量能达到万级,社区活跃度也⽐较⾼,⽐较适合中⼩型公司,数据量没那么⼤,且并发没
那么⾼的场景

RabbitMQ安装

ubuntu

安装Erlang

RabbitMQ安装可以用ubuntu自带的安装,但是这个版本老,我们也可以在官网安装
官网安装

我们现在用Ubuntu仓库中的版本来安装

先安装Erlang

#更新软件包
sudo apt-get update
#安装erlang
sudo apt-get install erlang
erl

输入erl就可以检查是否安装好了
输入halt().就退出了
在这里插入图片描述

安装RabbitMQ

#更新软件包
sudo apt-get update
#安装rabbitmq
sudo apt-get install rabbitmq-server
#确认安装结果
systemctl status rabbitmq-server

在这里插入图片描述
这样就成功了

安装RabittMQ管理界面

rabbitmq-plugins enable rabbitmq_management

启动服务

sudo service rabbitmq-server start

默认是启动的

访问

通过 IP:port 访问界⾯
15672为默认端口号

界面端口号是15672
服务端通信的端口号是5672
所以这两个都要开放

在这里插入图片描述

默认的账号名,密码
是guest,guest

在这里插入图片描述
这个的意思是,这个用户名只能在本地登录,我们这个不是本地登录
所以要创建新的用户

添加用户

rabbitmqctl add_user ${账号} ${密码}
rabbitmqctl add_user admin admin

在这里插入图片描述
它告诉我们不要忘记设置权限

添加权限

#rabbitmqctl set_user_tags ${账号} ${⻆⾊名称}
rabbitmqctl set_user_tags admin administrator

这个的意思就是给admin设置为管理员用户
以下⻆⾊可选
RabbitMQ⽤⼾⻆⾊分为Administrator、Monitoring、Policymaker、Management、
Impersonator、None共六种⻆⾊

  1. Administrator 超级管理员,可登陆管理控制台(启⽤management plugin的情况下),可查看所
    有的信息,并且可以对⽤⼾,策略(policy)进⾏操作
  2. Monitoring 监控者,可登陆管理控制台(启⽤management plugin的情况下),同时可以查看
    rabbitmq节点的相关信息(进程数,内存使⽤情况,磁盘使⽤情况等)。
  3. Policymaker 策略制定者,可登陆管理控制台(启⽤management plugin的情况下),同时可以对
    policy进⾏管理。但⽆法查看节点的相关信息.
  4. Management 普通管理者,仅可登陆管理控制台(启⽤management plugin的情况下),⽆法看到
    节点信息,也⽆法对策略进⾏管理.
  5. Impersonator 模拟者,⽆法登录管理控制台。
  6. None 其他⽤⼾,⽆法登陆管理控制台,通常就是普通的⽣产者和消费者

在这里插入图片描述
这样就可以登录进来了

docker安装

#查询镜像
docker search rabbitmq:management
#获取镜像
docker pull rabbitmq:management
#运⾏镜像
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
#查看正在运⾏的容器
docker ps
#进⼊容器内部
docker exec -it 容器ID /bin/bash
、#查看正在运⾏的容器
docker ps
#进⼊容器内部
docker exec -it 容器ID /bin/bash
#添加⽤⼾admin
rabbitmqctl add_user admin admin
#给⽤⼾授权
rabbitmqctl set_user_tags admin administrator

其他操作

1. 查找rabbitmq位置
[lucf@VM-8-12-centos ~]$ whereis rabbitmq
rabbitmq: /usr/lib/rabbitmq /etc/rabbitmq2. 新增配置⽂件rabbitmq.conf
(/etc/rabbitmq路径下创建rabbitmq.conf⽂件, 并添加以下内容)
#修改client端⼝为8942(默认为5672)
listeners.tcp.default=8942
#修改管理界⾯端⼝为8943(默认为15672)
management.tcp.port=89433.修改rabbitmq-defaults⽂件,添加配置⽂件路径
⽂件路径: /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.30/sbin/rabbitmq-defaults
编辑rabbitmq-defaults, 在⽂本最后添加如下代码
#添加配置路径到⽂件中,保存退出
CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf4.重启RabbitMQ
sudo systemctl restart rabbitmq-server#启动服务
sudo systemctl start rabbitmq-server
#停⽌服务
sudo systemctl stop rabbitmq-server
#重启服务
sudo systemctl restart rabbitmq-server
#添加开机启动服务
sudo systemctl enable rabbitmq-server
#检查服务状态
sudo systemctl status rabbitmq-server三. 卸载RabbitMQ
1. Ubuntu
1.1 停⽌RabbitMQ服务
1 sudo systemctl stop rabbitmq-server
1.2 查找RabbitMQ安装情况
1 dpkg -l | grep rabbitmq
1.3 卸载rabbitmq已安装的相关内容
1 sudo apt-get purge --auto-remove rabbitmq-server
1.4 卸载Erlang
1. 查看erlang安装的相关列表
1 dpkg -l | grep erlang
2. 卸载erlang已安装的相关内容
1 sudo apt-get purge --auto-remove erlang

RabbitMQ核心概念

在这里插入图片描述

Producer和Consumer

Producer: ⽣产者,是RabbitMQServer的客⼾端,向RabbitMQ发送消息
Consumer:消费者,也是RabbitMQServer的客⼾端,从RabbitMQ接收消息
Broker:其实就是RabbitMQServer,主要是接收和收发消息
⽣产者(Producer)创建消息,然后发布到RabbitMQ中.在实际应⽤中,消息通常是⼀个带有⼀定业务
逻辑结构的数据,⽐如JSON字符串.消息可以带有⼀定的标签,RabbitMQ会根据标签进⾏路由,把消
息发送给感兴趣的消费者(Consumer).
消费者连接到RabbitMQ服务器,就可以消费消息了,消费的过程中,标签会被丢掉.消费者只会收到
消息,并不知道消息的⽣产者是谁,当然消费者也不需要知道.
对于RabbitMQ来说,⼀个RabbitMQBroker可以简单地看作⼀个RabbitMQ服务节点,或者
RabbitMQ服务实例.⼤多数情况下也可以将⼀个RabbitMQBroker看作⼀台RabbitMQ服务器

Connection和Channel

Connection: 连接.是客⼾端和RabbitMQ服务器之间的⼀个TCP连接.端口号是5672,这个连接是建⽴消息传递的基
础,它负责传输客⼾端和服务器之间的所有数据和控制信息.
Channel: 通道,信道.Channel是在Connection之上的⼀个抽象层.在RabbitMQ中,⼀个TCP连接可以
有多个Channel,每个Channel都是独⽴的虚拟连接.消息的发送和接收都是基于Channel的.
通道的主要作⽤是将消息的读写操作复⽤到同⼀个TCP连接上,这样可以减少建⽴和关闭连接的开销,提⾼性能.
生产者和消费者都是客户端

Virtual host

Virtual host: 虚拟主机.这是⼀个虚拟概念.它为消息队列提供了⼀种逻辑上的隔离机制.对于
RabbitMQ⽽⾔,⼀个BrokerServer上可以存在多个VirtualHost.当多个不同的⽤⼾使⽤同⼀个
RabbitMQ Server提供的服务时,可以虚拟划分出多个vhost,每个⽤⼾在⾃⼰的vhost创建
exchange/queue 等类似MySQL的"database",是⼀个逻辑上的集合.⼀个MySQL服务器可以有多个database

Queue

Queue: 队列,是RabbitMQ的内部对象,⽤于存储消息
多个消费者,可以订阅同⼀个队列

Exchange

Exchange: 交换机.message到达broker的第⼀站,它负责接收⽣产者发送的消息,并根据特定的规则
把这些消息路由到⼀个或多个Queue列中.
Exchange起到了消息路由的作⽤,它根据类型和规则来确定如何转发接收到的消息.
类似于发快递之后,物流公司怎么处理呢,根据咱们的地址来分派这个快递到不同的站点,然后再送到
收件⼈⼿⾥.这个分配的⼯作,就是交换机来做的

RabbitMQ⼯作流程

  1. Producer⽣产了⼀条消息
  2. Producer连接到RabbitMQBroker,建⽴⼀个连接(Connection),开启⼀个信道(Channel)
  3. Producer声明⼀个交换机(Exchange),路由消息
  4. Producer声明⼀个队列(Queue),存放信息
  5. Producer发送消息⾄RabbitMQBroker
  6. RabbitMQBroker接收消息,并存⼊相应的队列(Queue)中,如果未找到相应的队列,则根据⽣产者
    的配置,选择丢弃或者退回给⽣产者.

AMQP

AMQP(AdvancedMessageQueuingProtocol)是⼀种⾼级消息队列协议,AMQP定义了⼀套确定的
消息交换功能,包括交换器(Exchange),队列(Queue)等.这些组件共同⼯作,使得⽣产者能够将消息发
送到交换器.然后由队列接收并等待消费者接收.AMQP还定义了⼀个⽹络协议,允许客⼾端应⽤通过该
协议与消息代理和AMQP模型进⾏交互通信
RabbitMQ是遵从AMQP协议的,换句话说,RabbitMQ就是AMQP协议的Erlang的实现(当然RabbitMQ还⽀持STOMP2,MQTT2等协议).AMQP的模型结构和RabbitMQ的模型结构是⼀样的

RabbiMQ简单使用

界面操作

这里可以创建用户,然后设置用户类型,这样点右上角退出,就可以重新登录了

在这里插入图片描述
点这个,然后可以创建虚拟机了

在这里插入图片描述
在这里插入图片描述
这样虚拟机就出来了
点进去这个虚拟机

在这里插入图片描述
使用哪个账号添加的这个虚拟机,就这个用户有对应的权限

在这里插入图片描述
这里面点击set,就可以对对应的设置权限了
在这里插入图片描述
这里可以查看用户的权限,也可以在虚拟机里面看有哪些用户的权限

在这里插入图片描述
都是可以set的

默认每个用户都有一个杠的虚拟机,但是不一定有权限

还可以清理权限

springboot集成RabbitMQ

RabbitMQ 共提供了7种⼯作模式
官网

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

这就是模式
第一第二用的是默认的交换机
X是交换机,起了作用的
第三个是广播的模式
第四个是有条件的模式
第五个是通配符的条件
我们用第一个

先引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

在user-service里面引入
然后是添加配置

#配置RabbitMQ的基本信息 
spring:rabbitmq:host: 110.41.51.65port: 15673  #默认为5672 username: studypassword: studyvirtual-host: bite  #默认值为 /

或者下面这个方式

#amqp://username:password@Ip:port/virtual-hostspring:rabbitmq:addresses: amqp://bite:1234@139.159.230.105:5672/blog

我们先声明一个队列

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

在这里插入图片描述
这个就是队列

然后就是写生产者了
就写一个测试方法就可以了
RabbitMQ和redis一样,提供了一个template,自动注入bean的,很好用

在这里插入图片描述
第一个参数是交换机的名称,我们可以写一个空的交换机,这个是默认的交换机
在这里插入图片描述
就是第一个交换机
他是direct类型的,要有绑定规则,第二个参数就是绑定规则
这个交换机有一个绑定规则叫做routingKey,就是在发送消息的时候,要携带一个标签
第三个参数就是消息内容了
routingKey就是决定这个交换机路由到哪个队列
在这里插入图片描述
这个就是默认的交换机的默认的绑定规则
就是交换机“”把消息,给队列hello
运行一下
在这里插入图片描述
在这里插入图片描述
看到这里有一个hello的队列

在这里插入图片描述
点进去就可以看到我们的消息内容了

然后开始看消费者代码
要用RabbitListener这个注解了

在这里插入图片描述

我们生产者多生产几个消息,注意Message的包不用弄错了,有很多个

然后就是重启服务

在这里插入图片描述
这样就收到消息了,这个是服务启动就一直监听的
所以会打印完

用户服务引入RabbitMQ

我们增加一个配置,就是手动确认方式
默认情况下:消费者取消息的时候,消息会自动的删除,自动确认
还有一种方式是手动确认
在这里插入图片描述

spring:rabbitmq:addresses: amqp://bite:1234@139.159.230.105:5672/bloglistener:direct:acknowledge-mode: manual

这样就是手动确认的了

然后是声明一个队列

在这里插入图片描述

这次我们用这个发布订阅模式,就是交换机根据一定的规则,把消息路由到一个或者多个队列中
在这里插入图片描述

交换机有多个类型,一个Fanout,direct,topic,headers(用的少)
原来我们使用的就是direct
Fanout是广播的模式:把消息交给所有绑定到这个交换机的队列
direct是把消息交给符合指定routing key的队列
topic是把消息交给符合指定routing pattern(路由模式)的队列
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Fanout就是binding key为空

topic就是可以用通配符的,可以有*

我们使用广播模式,那么binding key和routing key都为空

我们给队列取名,名字弄成一个常量类
在这里插入图片描述

然后写队列

在这里插入图片描述
我们刚刚用的交换机是默认的交换机
现在我们自己创建一个我们自己的交换机

在这里插入图片描述
然后是交换机和队列进行绑定

注意引入的包都是amqp的

在这里插入图片描述
在这里插入图片描述
简单模式我们没有像这样一样进行绑定,因为使用的是默认的交换机,就不用声明交换机了
routing key就是去绑定了
在这里插入图片描述
默认交换机就是这样的,要用routing key,指定队列,默认交换机中routing key就等于队列名称
第一个参数是交换机名称
不用默认交换机的话,就要自己定义交换机,和绑定关系

然后开始写生产者

生产者

在这里插入图片描述

    @Autowiredprivate RabbitTemplate rabbitTemplate;

先注入进来

在这里插入图片描述
这样就发送完成了

现在开始写消费者

在这里插入图片描述
这样就写好了,但是我们要手动确认,怎么确认呢
确认的时候,先确认这个消息的id
先拿到id
获取消息的id,在信道上唯一,确认的时候也是在信道上确认
所以参数还要拿到channel这个信道
在这里插入图片描述
选这个
在这里插入图片描述
这样就写好了

在这里插入图片描述
在这里插入图片描述
但是我们这样写还是会报错的
为什么呢
默认情况下 RabbitMQ 是自动ACK(确认签收)机制,就意味着 MQ 会在消息发送完毕后,自动帮我们去ACK(确认),若是在代码中再手动确认签收,就会造成确认错误。
所以改一下
在这里插入图片描述
这样就不会出现报错信息了
我们还可以单独用一个类,来作为消息的发送,也是可以的
在这里插入图片描述
看到队列和交换机都对应起来了,绑定起来了

第二种方式写法

在这里插入图片描述
直接注释掉

我们可以直接用注解RabbitListener来声明绑定关系

@RabbitListener(bindings = @QueueBinding())

这个就是声明了一个绑定关系了
在这里插入图片描述
这样写就可以了,和刚刚写的作用是一模一样的
在这里插入图片描述

总结

相关文章:

博客系统-RabbitMQ

前言 RabbitMQ介绍 ⽤⼾注册完成之后,系统会给⽤⼾发送⼀封邮件通知 但是邮件发送成功失败并不影响我们⽤⼾注册成功.我们可以采⽤RabbitMQ来进⾏服务的解耦 RabbitMQ是⼀个开源的消息代理和队列服务器&#xff0c;⼴泛⽤于实现消息队列和事件通知.它⽀持多种消息 协议&#…...

面试题:循环引用两个节点相互引用,如何判断哪个用 shared_ptr?哪个用 weak_ptr?

目录 1.引言 2.原理 3.所有权模型与指针选择 4.复杂场景的决策策略 5.注意事项 6.总结 1.引言 当两个对象通过 shared_ptr 相互引用时&#xff0c;会产生循环引用问题&#xff0c;导致内存泄漏。因为这两个对象的引用计数永远不会变为 0&#xff0c;即使它们在程序的其他…...

go语言优雅关机和优雅重启笔记

一、优雅关机 生活化例子 餐馆关门&#xff1a;你去餐馆吃火锅&#xff0c;刚坐下点完菜&#xff08;客户端发请求&#xff09;&#xff0c;餐馆老板突然接到通知要停电&#xff08;收到关机指令&#xff09;。老板很贴心&#xff0c;先停止接待新客人&#xff08;停止接收新请…...

Python赋能去中心化电子商务平台:重构交易生态的新未来

Python赋能去中心化电子商务平台:重构交易生态的新未来 近年来,传统电子商务平台由于依赖中心化的服务器架构,面临数据隐私泄露、平台垄断、交易中介费用高昂以及信任危机等诸多挑战。而随着区块链和Web 3.0理念的快速普及以及零信任安全架构、边缘计算等新兴技术的不断成熟…...

山东大学软件学院项目实训-基于大模型的模拟面试系统-Token过期重定向问题

项目结构 ├── assets/ # 静态资源&#xff08;CSS/图片&#xff09; ├── components/ # Vue 组件 ├── layouts/ # 布局模板 ├── pages/ # 自动生成路由 ├── plugins/ # 插件&#xff08;如 axios 拦截器&#xff09; …...

树莓派系统中设置固定 IP

在基于 Ubuntu 的树莓派系统中&#xff0c;设置固定 IP 地址主要有以下几种方法&#xff1a; 方法一&#xff1a;使用 Netplan 配置&#xff08;Ubuntu 18.04 及以上版本默认使用 Netplan&#xff09; 查看网络接口名称 在终端输入ip link或ip a命令&#xff0c;查看当前所使…...

JBoss + WildFly 本地开发环境完全指南

JBoss WildFly 本地开发环境完全指南 本篇笔记主要实现在本地通过 docker 创建 JBoss 和 WildFly 服务器这一功能&#xff0c;基于红帽的禁制 EAP 版本的重新分发&#xff0c;所以我这里没办法放 JBoss EAP 的 zip 文件。WildFly 是免费开源的版本&#xff0c;可以在红帽官网找…...

网络原理 - 应用层, 传输层(UDP 和 TCP) 进阶, 网络层, 数据链路层 [Java EE]

目录 应用层 1. 应用层的作用 2. 自定义应用层协议 3. 应用层的 "通用协议格式" 3.1 xml 3.2 json 3.3 protobuffer (pd) 传输层 1. UDP 1.1 无连接 1.2 不可靠传输 1.3 面向数据报 1.4 全双工 1.5 缓冲区 1.6 UDP 数据报 2. TCP 2.1 有连接 …...

百级Function架构集成DeepSeek实践:Go语言超大规模AI工具系统设计

一、百级Function系统的核心挑战 1.1 代码结构问题 代码膨胀现象&#xff1a;单个文件超过2000行代码路由逻辑复杂&#xff1a;巨型switch-case结构维护困难依赖管理失控&#xff1a;跨Function依赖难以追踪 // 传统实现方式的问题示例 switch functionName { case "fu…...

全同态加密医疗数据分析集python实现

目录 摘要一、前言二、全同态加密与医疗数据分析概述2.1 全同态加密(FHE)简介2.2 医疗数据分析需求三、数据生成与预处理四、系统架构与流程4.1 系统架构图五、核心数学公式六、异步任务调度与(可选)GPU 加速七、PyQt6 GUI 设计八、完整代码实现九、自查测试与总结十、展望…...

字节头条golang二面

docker和云服务的区别 首先明确Docker的核心功能是容器化&#xff0c;它通过容器技术将应用程序及其依赖项打包在一起&#xff0c;确保应用在不同环境中能够一致地运行。而云服务则是由第三方提供商通过互联网提供的计算资源&#xff0c;例如计算能力、存储、数据库等。云服务…...

关于进程状态

目录 进程的各种状态 运行状态 阻塞状态 挂起状态 linux中的进程状态、 进程状态查看 S状态&#xff08;浅睡眠&#xff09; t 状态&#xff08;追踪状态&#xff09; T状态&#xff08;暂停状态&#xff09; ​编辑 kill命令手册 D状态&#xff08;深度睡眠&#…...

操作系统是如何运行的?

硬件中断 在我们使用键盘的时候&#xff0c;操作系统要怎么知道键盘上有数据了呢&#xff1f;硬件中断&#xff01; 硬件中断过程如图所示&#xff1a; 按照图中所示&#xff0c;外设直接与CPU进行交互&#xff0c;但是之前对于冯诺依曼体系架构的学习可知&#xff0c;外设要…...

【智驾中的大模型 -3】VLA 在自动驾驶中的应用

1.前言 在上一篇文章中&#xff0c;我们深入探讨了 VLM 模型在自动驾驶中的应用。VLA&#xff08;Very Large Architecture&#xff0c;大型架构&#xff09;和 VLM&#xff08;Very Large Model&#xff0c;非常大模型&#xff09;在 AI 领域皆指向超大规模的神经网络模型&am…...

Go语言中的sync.Map与并发安全数据结构完全指南

1. 引言 在Go语言的世界里&#xff0c;并发不是一个附加功能&#xff0c;而是语言的核心设计理念。那句广为人知的"Do not communicate by sharing memory; instead, share memory by communicating"&#xff08;不要通过共享内存来通信&#xff0c;而应该通过通信来…...

ADVB协议

ADVB:航空数字视频总线 ADVB协议是基于FC光纤通道协议和FC-AV光纤音频视频协议标准来制定 的一种新型的数字视频接口和协议。 FC协议&#xff0c;FC-AV协议&#xff0c;FC-ADVB协议。 协议层次结构&#xff0c;协议拓扑结构。 ADVB总线协议container容器是作为基本传输单元…...

Vue3中provide和inject数据修改规则

在 Vue3 中&#xff0c;通过 inject 接收到的数据是否可以直接修改&#xff0c;取决于 provide 提供的值的类型和响应式处理方式&#xff1a; 1. 若提供的是普通值&#xff08;非响应式数据&#xff09; javascript 复制 // 父组件 provide(staticValue, 123); 子组件修改行…...

VuePress 使用教程:从入门到精通

VuePress 使用教程&#xff1a;从入门到精通 VuePress 是一个以 Vue 驱动的静态网站生成器&#xff0c;它为技术文档和技术博客的编写提供了优雅而高效的解决方案。无论你是个人开发者、团队负责人还是开源项目维护者&#xff0c;VuePress 都能帮助你轻松地创建和管理你的文档…...

Linux操作系统简介:从开源内核到技术生态

一、Linux的起源与核心架构 1. 历史背景与发展 1991年&#xff0c;芬兰赫尔辛基大学学生林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;开发了首个Linux内核。这一开源项目与GNU工具链结合&#xff0c;形成完整的GNU/Linux操作系统。截至2023年&#xff0c;Linux内核贡…...

iOS 应用性能测试工具对比:Xcode Instruments、克魔助手与性能狗

iOS 应用性能测试工具对比&#xff1a;Xcode Instruments、克魔助手与性能狗 在移动应用开发领域&#xff0c;性能优化是确保用户体验流畅、留存率高的关键因素。对于 iOS 开发者而言&#xff0c;选择合适的性能测试工具能够帮助快速定位和解决应用中的性能瓶颈。本文将深入分…...

CentOS 10 /root 目录重新挂载到新分区槽

1 观察 ##观察目录/root 所占的磁盘空间大小 rootbogon:~# du -smh /root/ 1.6G /root/ rootbogon:~# du -smh /* |grep root du: 无法访问 /proc/19146/task/19146/fd/3: 没有那个文件或目录 du: 无法访问 /proc/19146/task/19146/fdinfo/3: 没有那个文件或目录 du: 无法访问…...

【读书笔记·VLSI电路设计方法解密】问题64:什么是芯片的功耗分析

低功耗设计是一种针对VLSI芯片功耗持续攀升问题的设计策略。随着工艺尺寸微缩&#xff0c;单颗芯片可集成更多元件&#xff0c;导致功耗相应增长。更严峻的是&#xff0c;现代芯片工作频率较二十年前大幅提升&#xff0c;而功耗与频率呈正比关系。因此&#xff0c;芯片功耗突破…...

python爬虫复习

requests模块 爬虫的分类 通用爬虫&#xff1a;将一整张页面进行数据采集聚焦爬虫&#xff1a;可以将页面中局部或指定的数据进行采集 聚焦爬虫是需要建立在通用的基础上来实现 功能爬虫&#xff1a;基于selenium实现的浏览器自动化的操作分布式爬虫&#xff1a;使用分布式机群…...

深入解析主流数据库体系架构:从关系型到云原生

数据库是现代信息系统的核心组件&#xff0c;其体系架构设计直接影响性能、扩展性和可靠性。本文将从传统关系型数据库到新兴云原生数据库&#xff0c;系统解析主流数据库的架构特点及适用场景。 目录 一、关系型数据库&#xff08;RDBMS&#xff09;架构 ​​典型代表​​&…...

2026《数据结构》考研复习笔记四(第一章)

绪论 前言时间复杂度分析 前言 由于先前笔者花费约一周时间将王道《数据结构》知识点大致过了一遍&#xff0c;圈画下来疑难知识点&#xff0c;有了大致的知识框架&#xff0c;现在的任务就是将知识点逐个理解透彻&#xff0c;并将leetcode刷题与课后刷题相结合。因此此后的过…...

Mysql insert一条数据的详细过程

以下是MySQL在接收到INSERT语句后存储数据的详细过程解析&#xff0c;结合存储引擎&#xff08;以InnoDB为例&#xff09;和物理存储机制分步说明。 一、SQL解析与事务启动 1.语法解析 MySQL首先解析INSERT语句&#xff0c;验证字段是否存在、数据类型是否匹配、约束&#xf…...

流水灯右移程序(STC89C52单片机)

#include <reg52.h> sbit ADDR0 P1^0; sbit ADDR1 P1^1; sbit ADDR2 P1^2; sbit ADDR3 P1^3; sbit ENLED P1^4; void main() { unsigned int i 0; //定义循环变量i&#xff0c;用于软件延时 unsigned char cnt 0; //定义计数变量cnt&#xff0c;用…...

AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B专属管家大模型

环境&#xff1a; AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 Qwen2.-1.5B/3B Llama factory llama.cpp 问题描述&#xff1a; AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B管家大模型 解决方案&#xff1a; 一、准备数据集我这…...

智能体团队 (Agent Team)

概述 智能体团队是一种多智能体协作模式&#xff0c;它将多个智能体组织成一个团队&#xff0c;共同解决复杂任务。与智能体监督模式不同&#xff0c;智能体团队中的成员通常具有平等的地位&#xff0c;通过相互交流和协作来达成目标。这种模式特别适合需要多种观点或多领域专…...

AI日报 - 2025年04月19日

&#x1f31f; 今日概览(60秒速览) ▎&#x1f916; AGI突破 | OpenAI与Google模型在复杂推理上展现潜力&#xff0c;但距AGI仍有距离&#xff1b;因果AI被视为关键路径。 模型如o3解决复杂迷宫&#xff0c;o4-mini通过棋盘测试&#xff0c;但专家预测AGI仍需30年。 ▎&#x1…...

【实战中提升自己】内网安全部署之dot1x部署 本地与集成AD域的主流方式(附带MAC认证)

1 dot1x部署【用户名密码认证&#xff0c;也可以解决私接无线AP等功能】 说明&#xff1a;如果一个网络需要通过用户名认证才能访问内网&#xff0c;而认证失败只能访问外网与服务器&#xff0c;可以部署dot1x功能。它能实现的效果是&#xff0c;当内部用户输入正常的…...

算法—合并排序—js(场景:大数据且需稳定性)

合并排序基本思想&#xff08;稳定且高效&#xff09; 将数组递归拆分为最小单元&#xff0c;合并两个有序数组。 特点&#xff1a; 时间复杂度&#xff1a;O(n log n) 空间复杂度&#xff1a;O(n) 稳定排序 // 合并排序-分解 function mergeSort(arr) {if (arr.length < …...

绝对路径与相对路径

绝对路径和相对路径是在计算机系统中用于定位文件或目录的两种方式&#xff0c;以下是具体介绍&#xff1a; 绝对路径 • 定义&#xff1a;是从文件系统的根目录开始到目标文件或目录的完整路径&#xff0c;它包含了从根目录到目标位置的所有目录和子目录信息&#xff0c;具有…...

RabbitMQ,添加用户时,出现Erlang cookie不一致,导致添加用户失败的问题解决

1. 问题现象 RabbitMQ 添加用户&#xff0c;出现以下报错 ./rabbitmgctl add user admin admin666*2. 问题原因和解决方法 安装的 RabbitMQ 里的 Erlang cookie&#xff0c;和 Erlang 环境的 cookie 不一致导致的 解决方法&#xff1a;将 Erlang 环境的 cookie &#xff0c…...

阿拉丁神灯-第16届蓝桥第4次STEMA测评Scratch真题第2题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥真题&#xff0c;这是Scratch蓝桥真题解析第219讲。 第16届蓝桥第4次STEMA测评已于2025年1月12日落下帷幕&#xff0c;编程题一共有5题&#xff08;初级组只有前4道编…...

常用的验证验证 onnxruntime-gpu安装的命令

#工作记录 我们经常会遇到明明安装了onnxruntime-gpu或onnxruntime后&#xff0c;无法正常使用的情况。 一、强制重新安装 onnxruntime-gpu 及其依赖 # 强制重新安装 onnxruntime-gpu 及其依赖 pip install --force-reinstall --no-cache-dir onnxruntime-gpu1.18.0 --extra…...

docker配置skywalking 监控springcloud应用

在使用 Docker 配置 SkyWalking 监控 Spring Cloud 应用时&#xff0c;主要分为以下几个步骤&#xff1a; 1. 准备工作 确保你的开发环境已经安装了 Docker 和 Docker Compose。准备好 Spring Cloud 应用代码&#xff0c;并确保它支持 SkyWalking 的探针&#xff08;Agent&…...

HBase安装与基本操作指南

## 1. 安装准备 首先确保您的系统已经安装了以下组件: - Java JDK 8或更高版本 - Hadoop(HBase可以运行在独立模式下,但建议配合Hadoop使用) ## 2. 下载与安装HBase ```bash # 下载HBase(以2.4.12版本为例) wget https://downloads.apache.org/hbase/2.4.12/hbase-2…...

【Linux】Rhcsa复习5

一、Linux文件系统权限 1、文件的一般权限 文件权限针对三类对象进行定义&#xff1a; owner 属主&#xff0c;缩写u group 属组&#xff0c; 缩写g other 其他&#xff0c;缩写o 每个文件针对每类访问者定义了三种主要权限&#xff1a; r&#xff1a;read 读 w&…...

C++11特性补充

目录 lambda表达式 定义 捕捉的方式 可变模板参数 递归函数方式展开参数包 数组展开参数包 移动构造和移动赋值 包装器 绑定bind 智能指针 RAII auto_ptr unique_ptr shared_ptr 循环引用 weak_ptr 补充 总结 特殊类的设计 不能被拷贝的类 只能在堆上创建…...

缓存 --- Redis性能瓶颈和大Key问题

缓存 --- Redis性能瓶颈和大Key问题 内存瓶颈网络瓶颈CPU 瓶颈持久化瓶颈大key问题优化方案 Redis 是一个高性能的内存数据库&#xff0c;但在实际使用中&#xff0c;可能会在内存、网络、CPU、持久化、大键值对等方面遇到性能瓶颈。下面从这些方面详细分析 Redis 的性能瓶颈&a…...

css3新特性第三章(文本属性)

一、文本属性 文本阴影文本换行文本溢出文本修饰文本描边 1.1 文本阴影 在 CSS3 中&#xff0c;我们可以使用 text-shadow 属性给文本添加阴影。 语法&#xff1a; text-shadow: h-shadow v-shadow blur color; 值描述h-shadow必需写&#xff0c;水平阴影的位置。允许负值。…...

Redis 缓存—处理高并发问题

Redis的布隆过滤器、单线程架构、双写一致性、比较穿透、击穿及雪崩、缓存更新方案及分布式锁。 1 布隆过滤器 是一种高效的概率型数据结构&#xff0c;用于判断元素是否存在。主要用于防止缓存穿透&#xff0c;通过拦截不存在的数据查询&#xff0c;避免击穿数据库。 原理&…...

嵌入式芯片中的 SRAM 内容细讲

什么是 RAM&#xff1f; RAM 指的是“随机存取”&#xff0c;意思是存储单元都可以在相同的时间内被读写&#xff0c;和“顺序访问”&#xff08;如磁带&#xff09;相对。 RAM 不等于 DRAM&#xff0c;而是一类统称&#xff0c;包括 SRAM 和 DRAM 两种主要类型。 静态随机存…...

实操基于MCP驱动的 Agentic RAG:智能调度向量召回或者网络检索

我们展示了一个由 MCP 驱动的 Agentic RAG&#xff0c;它会搜索向量数据库&#xff0c;当然如果有需要他会自行进行网络搜索。 为了构建这个系统&#xff0c;我们将使用以下工具&#xff1a; 博查搜索 用于大规模抓取网络数据。作为Faiss向量数据库。Cursor 作为 MCP 客户端。…...

位运算---总结

位运算 基础 1. & 运算符 : 有 0 就是 0 2. | 运算符 : 有 1 就是 1 3. ^ 运算符 : 相同为0 相异为1 and 无进位相加位运算的优选级 不用在意优先级,能加括号就加括号给一个数 n ,确定它的二进制位中第 x 位是 0 还是 1? 规定: 题中所说的第x位指:int 在32位机器下4个…...

从0开始搭建一套工具函数库,发布npm,支持commonjs模块es模块和script引入使用

文章目录 文章目标技术选型工程搭建1. 初始化项目2. 安装开发依赖3. 项目结构4. 配置文件tsconfig.json.eslintrc.jseslint.config.prettierrc.jsrollup.config.cjs创建 .gitignore文件 设置 Git 钩子创建示例工具函数8. 版本管理和发布9 工具函数测试方案1. 安装测试依赖2. 配…...

精通 Spring Cache + Redis:避坑指南与最佳实践

Spring Cache 以其优雅的注解方式&#xff0c;极大地简化了 Java 应用中缓存逻辑的实现。结合高性能的内存数据库 Redis&#xff0c;我们可以轻松构建出响应迅速、扩展性强的应用程序。然而&#xff0c;在享受便捷的同时&#xff0c;一些常见的“坑”和被忽视的最佳实践可能会悄…...

DSP28335入门学习——第一节:工程项目创建

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.20 DSP28335开发板学习——第一节&#xff1a;工程项目创建 前言开发板说明引用解答…...

Docker Registry(镜像仓库)

官方架构 Docker 使用客户端 - 服务器 (C/S) 架构模式&#xff0c;使用远程 API 来管理和创建 Docker 容器。Docker 容器通过 Docker 镜像来创建。 Docker 仓库(Registry)&#xff1a;Docker 仓库用来保存镜像&#xff0c;可以理解为代码控制中的代码仓库。Docker Hu…...