RabbitMq學習(第一天)

文章目錄

  • 1、mq(消息隊列)概述
  • 2、RabbitMQ環境搭建
  • 3、java基于AMQP協議操作RabbitMQ
  • 4、基于Spring AMQP操作RabbitMQ
  • 5、代碼中創建隊列與交換機
    • ①、配置類創建
    • ②、基于@RabbitListener注解創建
  • 6、RabbitMQ詳解
    • ①、work模型
    • ②、交換機
      • 1、Fanout(廣播)交換機
      • 2、Direct(定向)交換機
      • 3、Topic(話題)交換機
  • 7、消息轉換器
  • 總結

1、mq(消息隊列)概述

MQ 是 Message Queue(消息隊列)的簡稱,是一種用于異步通信和解耦的中間件技術。它的核心功能是通過隊列結構存儲和傳輸消息,允許生產者(發送消息的一方)和消費者(接收消息的一方)在不同時間進行數據交換,而無需直接連接

MQ作用:

①、異步調用:

異步調用方式其實就是基于消息通知的方式,一般包含三個角色:

  • 消息發送者:投遞消息的人,就是原來的調用方
  • 消息代理:管理、管理存儲、轉發消息的中間件
  • 消息接收者:接收和處理消息的人,就是原來的服務提供方

在這里插入圖片描述

優點

  • 異步調用,無需等待,性能好
  • 故障隔離,下游服務故障不影響上游業務

缺點

  • 不能立即得到調用結果,時效性差
  • 確定下游業務執行是否成功
  • 業務安全依賴于Broker的可靠性

②、削峰/降流
在電子商務一些秒殺、促銷活動中,合理使用消息隊列可以有效抵御促銷活動剛開始大量訂單涌入對系統的沖擊。如下圖所示:
在這里插入圖片描述

③、降低系統耦合性

對于發送方來說,只需要將自己的消息發送到消息隊列就ok了,而對于接收方來說,只需要接收消息即可,而無需關注誰發的,極大降低了發送接收方的耦合性。

④、順序保證

消息隊列保證數據按照特定的順序被處理,適用于那些對數據順序有嚴格要求的場景。大部分消息隊列,例如 RocketMQ、RabbitMQ、Pulsar、Kafka,都支持順序消息。

⑤、延時/定時處理
消息發送后不會立即被消費,而是指定一個時間,到時間后再消費。大部分消息隊列,例如 RocketMQ、RabbitMQ、Pulsar、Kafka,都支持定時/延時消息。

⑥、即時通訊

MQTT(消息隊列遙測傳輸協議)是一種輕量級的通訊協議,采用發布/訂閱模式,非常適合于物聯網(IoT)等需要在低帶寬、高延遲或不可靠網絡環境下工作的應用。它支持即時消息傳遞,即使在網絡條件較差的情況下也能保持通信的穩定性。RabbitMQ 內置了 MQTT 插件用于實現 MQTT 功能(默認不啟用,需要手動開啟)

四大mq產品對比:

在這里插入圖片描述

2、RabbitMQ環境搭建

我們在docker環境下通過docker pull來快速獲取RabbitMQ的鏡像。

拉取:

docker pull rabbitmq:3.8-management

運行:

docker run -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=123456 -v mq-plugins:/plugins  --name mq --hostname mq -p 15672:15672 -p 5672:5672 -d rabbitmq:3.8-management

其中,15672端口是圖形化界面的端口,而5672是發送接收消息的端口。

在這里插入圖片描述

登錄之后,界面如下:

在這里插入圖片描述

  • publisher: 消息發送者

  • consumer: 消息的消費者

  • queue: 隊列,存儲消息

  • exchange: 交換機,負責路由消息

  • connectors: 生產者或者消費者和消息隊列建立連接的情況

  • channels: 消息通道,生產者消費者進行通信需要建立一個通道。

  • Admin: 管理虛擬主機,添加和查看已有的用戶

RabbitMQ架構:
在這里插入圖片描述

3、java基于AMQP協議操作RabbitMQ

AMQP(Advanced Message Queuing Protocol),是用于在應用程序之間傳遞消息的開放標準協議。協議以語言和平臺無關,更符合互聯網的要求。

官網文檔教程:
java中操作RabbitMQ

新建java的maven項目,添加依賴:

	<dependencies><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.9.0</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.17</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>2.0.17</version></dependency></dependencies>

這幾個依賴必須導入。

發送方(Send.java) :

public class Send {private final static String QUEUE_NAME = "hello";public static void main(String[] args) {ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.138.133");factory.setPort(5672);factory.setUsername("root");factory.setPassword("123456");// 建立連接,創建管道try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);String message = "Hello RabbitMQ!";channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));System.out.println(" [x] Sent '" + message + "'");} catch (Exception e) {throw new RuntimeException(e);}}}

接收方(Recv.java) :

public class Recv {private final static String QUEUE_NAME = "hello";public static void main(String[] args) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.138.133");factory.setPort(5672);factory.setUsername("root");factory.setPassword("123456");// 建立連接,創建管道Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), StandardCharsets.UTF_8);System.out.println(" [x] Received '" + message + "'");};channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });}
}

host和用戶、密碼等依據自己情況修改
先運行Recv,此時接收方會處于等待接收的狀態,隨后Send發送消息,接收成功。
運行結果:

 [x] Sent 'Hello RabbitMQ!'[x] Received 'Hello RabbitMQ!'

4、基于Spring AMQP操作RabbitMQ

Spring AMQP是基于AMQP協議定義的一套API規范,提供了模板來發送和接收消息。包含兩部分,其中spring-amqp是基礎抽象,spring-rabbit是底層的默認實現。因此RabbitMQ中我們可以通過Spring進行操作。

	<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--AMQP依賴,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><!--單元測試--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies>

消息發送者

	@Resourceprivate RabbitTemplate rabbitTemplate;@Testpublic void testSend() {// 隊列名稱String queueName = "hello";// 消息String message = "hello RabbitMQ!";// 發送消息rabbitTemplate.convertAndSend(queueName, message);}

消息消費者(其實就是通過監聽隊列來獲取信息):
@RabbitListener()中的queues參數里面的值就是隊列的名字。

@Slf4j
@Component
public class Consumer {@RabbitListener(queues = {"hello"}) //這里參數是隊列的名字,填寫的時候按自己情況來。public void testConsumer(String msg) {log.info("消費者收到消息:" + msg);}}

如果想要在代碼中創建隊列的話,可以在config類中定義:

@Configuration
public class MQConfig {//代表創建一個叫queue的隊列@Beanpublic Queue queue() {return new Queue("queue");}
}

5、代碼中創建隊列與交換機

①、配置類創建

@Configuration
public class MQConfig {// 聲明交換機@Beanpublic FanoutExchange fanoutExchange() {return new FanoutExchange("test.fanout");}// 聲明隊列1@Beanpublic Queue fanoutQueue1() {return new Queue("fanout.queue1");}// 聲明隊列2@Beanpublic Queue fanoutQueue2() {return new Queue("fanout.queue2");}// 綁定隊列1與交換機@Beanpublic Binding bindingQueue1(Queue fanoutQueue1, FanoutExchange fanoutExchange) {return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);}// 綁定隊列2與交換機@Beanpublic Binding bindingQueue2(Queue fanoutQueue2, FanoutExchange fanoutExchange) {return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);}
}

如上就是通過在一個config類中定義bean實現注入。

②、基于@RabbitListener注解創建

@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue1"),exchange = @Exchange(name = "test.direct", type = ExchangeTypes.DIRECT),key = {"red", "blue"}
))

該注解用配置類等價于:

@Configuration
public class MQConfig {// 聲明交換機@Beanpublic DirectExchange fanoutExchange() {return new DirectExchange("test.direct");}// 聲明隊列1@Beanpublic Queue fanoutQueue1() {return new Queue("direct.queue1");}// 綁定隊列1與交換機@Beanpublic Binding bindingQueue1(Queue fanoutQueue1, DirectExchange directExchange) {return BindingBuilder.bind(fanoutQueue1).to(directExchange).with("red");}@Beanpublic Binding bindingQueue2(Queue fanoutQueue1, DirectExchange directExchange) {return BindingBuilder.bind(fanoutQueue1).to(directExchange).with("blue");}
}

可以說極大簡化了開發。

6、RabbitMQ詳解

①、work模型

work模型就是多個消費者綁定到一個隊列,加快消息處理速度,通過設置prefech來控制消費者領取消息的數量。
而prefetch默認值為250,這個可以自己來控制調整。

發送方代碼:

	@Testpublic void testWorkQueue() throws Exception {String queueName = "work.queue";for (int i = 0; i < 50; i++) {String message = "hello, worker, message_" + i;rabbitTemplate.convertAndSend(queueName, message);Thread.sleep(50);}}

接收方代碼:

    @RabbitListener(queues = {"work.queue"}) //這里參數是隊列的名字,填寫的時候按自己情況來。public void workConsumer(String msg) throws InterruptedException {System.out.println("work.queue隊列1收到消息:" + msg);Thread.sleep(20);}@RabbitListener(queues = {"work.queue"}) //這里參數是隊列的名字,填寫的時候按自己情況來。public void workConsumer2(String msg) throws InterruptedException {System.err.println("work.queue隊列2收到消息:" + msg);Thread.sleep(200);}

最后發現兩個接收方無論處理快還是慢,最后每個都只能處理25個消息,而我們一共發了50條消息,這樣會導致處理效率很低。
在這里插入圖片描述
解決方法,在properties中加一個配置:

spring:listener:simple:prefetch: 1

運行結果:
在這里插入圖片描述
這樣處理的話,效率就高多了,基本就是發一條消息,誰有空誰來處理即可。

②、交換機

1、Fanout(廣播)交換機

Fanout交換機會將接收到的消息廣播到每一個與其綁定的queue,也叫廣播模式。

在這里插入圖片描述

這里我們在隊列中聲名兩個queue,分別叫fanout.queue1和fanout.queue2。
交換機使用amq.fanout,為fanout類型
在這里插入圖片描述
在這里插入圖片描述

記得先將交換機與隊列進行綁定:

在這里插入圖片描述

接收方代碼:

    @RabbitListener(queues = {"fanout.queue1"}) //這里參數是隊列的名字,填寫的時候按自己情況來。public void fanoutConsumer(String msg) throws InterruptedException {System.out.println("fanout.queue隊列1收到消息:" + msg);}@RabbitListener(queues = {"fanout.queue2"}) //這里參數是隊列的名字,填寫的時候按自己情況來。public void fanoutConsumer2(String msg) throws InterruptedException {System.err.println("fanout.queue隊列2收到消息:" + msg);}

發送方代碼:

    @Testpublic void testFanoutQueue() throws Exception {String exchange = "amq.fanout";String message = "hello, everyone";rabbitTemplate.convertAndSend(exchange, "", message);}

運行結果:

fanout.queue隊列2收到消息:hello, everyone
fanout.queue隊列1收到消息:hello, everyone

2、Direct(定向)交換機

Direct Exchange 會將接收到的消息根據規則路由到指定的Queue,因此稱為定向路由。
每一個Queue都與Exchange設置一個BindingKey,發布者發送消息時,指定消息的RoutingKey,Exchange將消息路由到BindingKey與消息RoutingKey一致的隊列

在這里插入圖片描述
當交換機中的key對應的值和queue中的bingdingKey值相同時,消息就發送到對應的消費者手中,同時不同queue的bingdingKey值可以是相同的,同一個bindingKey可以有多個值。

創建兩個direct.queue:
在這里插入圖片描述
綁定到amq.direct上:
在這里插入圖片描述
接收消息代碼:

 @RabbitListener(queues = {"direct.queue1"}) //這里參數是隊列的名字,填寫的時候按自己情況來。public void DirectConsumer(String msg) throws InterruptedException {System.out.println("fanout.queue隊列1收到消息:" + msg);}@RabbitListener(queues = {"direct.queue2"}) //這里參數是隊列的名字,填寫的時候按自己情況來。public void DirectConsumer2(String msg) throws InterruptedException {System.err.println("fanout.queue隊列2收到消息:" + msg);}

發送消息代碼:

    @Testpublic void testDirectQueue() throws Exception {String exchange = "amq.direct";String message1 = "hello, Red";String message2 = "hello, Blue";String message3 = "hello, Yellow";rabbitTemplate.convertAndSend(exchange, "red", message1);rabbitTemplate.convertAndSend(exchange, "blue", message2);rabbitTemplate.convertAndSend(exchange, "yellow", message3);}

運行結果:

direct.queue隊列1收到消息:hello, Red
direct.queue隊列1收到消息:hello, Blue
direct.queue隊列2收到消息:hello, Red
direct.queue隊列2收到消息:hello, Yellow

3、Topic(話題)交換機

TopicExchange與DirectExchange類似,區別在于routingKey可以是多個單詞的列表,并且以“.”分割。

Queue與Exchange指定BindingKey時可以使用通配符:

#: 代指0個或多個單詞
*: 代指一個單詞

在這里插入圖片描述
新建兩個隊列:
在這里插入圖片描述
使用amq.topic綁定:
在這里插入圖片描述

接收方代碼:

    @RabbitListener(queues = {"topic.queue1"}) //這里參數是隊列的名字,填寫的時候按自己情況來。public void TopicConsumer(String msg) throws InterruptedException {System.out.println("topic.queue隊列1收到消息:" + msg);}@RabbitListener(queues = {"topic.queue2"}) //這里參數是隊列的名字,填寫的時候按自己情況來。public void TopicConsumer2(String msg) throws InterruptedException {System.err.println("topic.queue隊列2收到消息:" + msg);}

發送方代碼:

    @Testpublic void testTopicQueue() throws Exception {String exchange = "amq.topic";String message = "Japan's news";String message2 = "China's news";String message3 = "China's weather";String message4 = "Japan's weather";rabbitTemplate.convertAndSend(exchange, "Japan.news", message);rabbitTemplate.convertAndSend(exchange, "China.news", message2);rabbitTemplate.convertAndSend(exchange, "China.weather", message3);rabbitTemplate.convertAndSend(exchange, "Japan.weather", message4);}

運行結果:

topic.queue隊列2收到消息:Japan's news
topic.queue隊列2收到消息:China's news
topic.queue隊列1收到消息:China's news
topic.queue隊列1收到消息:China's weather

7、消息轉換器

發送java對象代碼:

    @Testpublic void testSendObject() {Map<String, Object> msg = new HashMap<>();msg.put("name", "jack");msg.put("age", 18);rabbitTemplate.convertAndSend("object.queue", msg);}

接收消息為亂碼:

在這里插入圖片描述
解決方法:
我們引入消息轉換器,使用json來處理消息。

引入對應依賴:

        <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>

接收方和消費方都配置消息轉換器:

import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;@Configuration
public class messageConfig {@Beanpublic MessageConverter messageConverter() {return new Jackson2JsonMessageConverter();}
}

在這里插入圖片描述

總結

重要點:

  1. 搭建環境,熟悉RabbitMQ面板與配置
  2. 使用SpringBoot集成開發配置
  3. 重點學會@RabbitListener的使用
  4. 熟悉常見交換機和隊列
  5. 配置使用消息轉換器

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80066.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80066.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80066.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

緩存置換:用c++實現最不經常使用(LFU)算法

在探討緩存置換算法時&#xff0c;我們曾詳細解讀過LRU&#xff08;Least Recently Used&#xff09;算法&#xff0c;它憑借 “最近最少使用” 的策略在緩存管理領域大放異彩。今天&#xff0c;讓我們將目光聚焦于另一種重要的緩存置換算法 ——LFU&#xff08;Least Frequent…

深度學習模型的部署實踐與Web框架選擇

引言 在深度學習項目的完整生命周期中&#xff0c;模型訓練只是第一步&#xff0c;將訓練好的模型部署到生產環境才能真正發揮其價值。本文將詳細介紹模型部署的核心概念、常見部署方式以及三種主流Python Web框架的對比分析&#xff0c;幫助開發者選擇最適合自己項目的技術方…

多功能氣體檢測報警系統,精準監測,守護安全

在化學品生產、石油化工、礦山、消防、環保、實驗室等領域&#xff0c;有毒有害氣體泄漏風險嚴重威脅工作人員和環境安全。化工企業生產中易產生大量可燃有毒氣體&#xff0c;泄漏達一定濃度易引發爆炸、中毒等重大事故&#xff1b;礦井下瓦斯、一氧化碳等有害氣體的濃度實時監…

lvgl多語言設置

搭建開發環境 安裝node.js 安裝node.js&#xff0c;點擊進入官網地址 安裝lv_i18n lv_i18n項目地址&#xff1a;Github&#xff1a;https://github.com/lvgl/lv_i18ngit運行命令安裝lv_i18n&#xff1a;npm i lv_i18n -g。測試命令&#xff1a;lv_i18n -h 搭建過程報錯 …

線程池技術

線程池基本概念 線程池就是在任務還沒有到來前&#xff0c;預先創建一定數量的線程放入空閑列表。這些線程都是處于阻塞狀態&#xff0c;不消耗CPU&#xff0c;但占用較小的內存空間。 當新任務到來時&#xff0c;緩沖池選擇一個空線程&#xff0c;把任務傳入此線程中運行&…

Go語言中的并發編程--詳細講解

文章目錄 Go語言并發編程**簡單介紹**goroutine channel 實現并發和并行for循環開啟多個協程Channel管道goroutine 結合 channel 管道**goroutine 結合 channel打印素數**單向管道Select多路復用Goroutine Recover解決協程中出現的PanicGo中的并發安全和互斥鎖 Go語言并發編程 …

C# NX二次開發:投影曲線和偏置曲線UFUN函數詳解

大家好&#xff0c;今天要講的是關于投影曲線和偏置曲線相關的函數。 &#xff08;1&#xff09;UF_CURVE_create_proj_curves1&#xff1a;這個函數的定義為創建投影曲線。 Defined in: uf_curve.h Overview Creates projection curves. Objects to project may be poi…

用R語言+隨機森林玩轉遙感空間預測-基于R語言機器學習遙感數據處理與模型空間預測技術及實際項目案例分析

遙感數據具有高維度、非線性及空間異質性等特點&#xff0c;傳統分析方法往往難以充分挖掘其信息價值。機器學習技術的引入為遙感數據處理與模型預測提供了新的解決方案&#xff0c;其中隨機森林&#xff08;Random Forest&#xff09;以其優異的性能和靈活性成為研究者的首選工…

unity 導入圖片后,可選擇精靈表自動切片,并可以導出為png

腳本源代碼&#xff1a; #if UNITY_EDITOR using UnityEditor; using UnityEngine; using System.IO; using UnityEditorInternal; using System.Collections.Generic; using System;public class TextureImporterWindow : EditorWindow {private string folderPath "D:…

使用 Azure DevSecOps 和 AIOps 構建可擴展且安全的多區域金融科技 SaaS 平臺

引言 金融科技行業有一個顯著特點&#xff1a;客戶期望能夠隨時隨地即時訪問其財務數據&#xff0c;并且對宕機零容忍。即使是短暫的中斷也會損害用戶的信心和忠誠度。與此同時&#xff0c;對數據泄露的擔憂已將安全提升到整個行業的首要地位。 在本文中&#xff0c;我們將探…

基于Django框架開發的B2C天天生鮮電商平臺

天天生鮮 介紹 天天生鮮是一個基于Django框架開發的B2C(Business-to-Customer)電商平臺&#xff0c;專注于生鮮食品的在線銷售。該項目采用了主流的Python Web開發框架Django&#xff0c;結合MySQL數據庫、Redis緩存等技術&#xff0c;實現了一個功能完整、界面友好的電商網站…

ASP.NET MVC4 技術單選及多選題目匯編

一、單選題&#xff08;共50題&#xff0c;每題2分&#xff09; 1、ASP.NET MVC4 的核心架構模式是什么&#xff1f; A. MVP B. MVVM C. MVC D.三層架構 答案&#xff1a;C 2、在 MVC4 中&#xff0c;默認的路由配置文件名是&#xff1f; A. Global.asax B. RouteConfig.cs C.…

26屆秋招收割offer指南

26屆暑期實習已經陸續啟動&#xff0c;這也意味著對于26屆的同學們來說&#xff0c;“找工作”已經提上了日程。為了幫助大家更好地準備暑期實習和秋招&#xff0c;本期主要從時間線、學習路線、核心知識點及投遞幾方面給大家介紹&#xff0c;希望能為大家提供一些實用的建議和…

數據中心機電建設

電氣系統 供配電系統 設計要求&#xff1a;數據中心通常需要雙路市電供電&#xff0c;以提高供電的可靠性。同時&#xff0c;配備柴油發電機組作為備用電源&#xff0c;確保在市電停電時能及時為關鍵設備供電。根據數據中心的規模和設備功耗&#xff0c;精確計算電力負荷&…

每日一題洛谷P1025 [NOIP 2001 提高組] 數的劃分c++

P1025 [NOIP 2001 提高組] 數的劃分 - 洛谷 (luogu.com.cn) #include<iostream> using namespace std; int n, k; int res 0; void dfs(int num,int step,int sum) {//判斷if (sum n) {if (step k) {res;return;}}if (sum > n || step k)return;//搜索for (int i …

大模型推理--從零搭建大模型推理服務器:硬件選購、Ubuntu雙系統安裝與環境配置

自從大模型火了之后就一直想自己組裝一臺機器去深入研究一下大模型&#xff0c;奈何囊中羞澀&#xff0c;遲遲也沒有行動。在下了很大的勇氣之后&#xff0c;終于花了接近4萬塊錢組裝了一臺臺式機&#xff0c;下面給大家詳細介紹一下我的裝機過程。 1.硬件配置 研究了一周&am…

第35周Zookkeeper+Dubbo Dubbo

Dubbo 詳解 一、Dubbo 是什么 官網與定義 Dubbo 是一款高性能、輕量級的開源服務框架&#xff0c;其官網為 double.apache.org&#xff0c;提供中文版本&#xff08;網址含 “zh”&#xff09;。 核心能力 Dubbo 具備六大核心能力&#xff1a; 面向接口代理的高性能 RPC …

NX二次開發——BlockUI 彈出另一個BlockUI對話框

最近在研究&#xff0c;裝配體下自動導出BOM表格中需要用到BlockUI 彈出另一個BlockUI對話框。通過對網上資料進行整理總結&#xff0c;具體如下&#xff1a; 1、明確主對話框、子對話框1和子對話框2 使用BlockUI創建.cpp和.hpp文件&#xff0c;dlx文件內容如下所示 主對話框…

PostgreSQL 系統管理函數詳解

PostgreSQL 系統管理函數詳解 PostgreSQL 提供了一系列強大的系統管理函數&#xff0c;用于數據庫維護、監控和配置。這些函數可分為多個類別&#xff0c;以下是主要功能的詳細說明&#xff1a; 一、數據庫配置函數 1. 參數管理函數 -- 查看所有配置參數 SELECT name, sett…

【2025軟考高級架構師】——計算機網絡(9)

摘要 全文主要圍繞計算機網絡相關知識展開&#xff0c;包括域名服務器查詢方式、網絡規劃與設計的關鍵技術、雙協議棧與隧道技術、層次化網絡設計、網絡冗余設計以及高可靠和高可用性等方面&#xff0c;旨在為軟考高級架構師的備考提供知識參考。 1. 通信網絡架構圖 2. 通信架…