RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)

news2024/12/28 19:26:41

文章目录

  • 十.RabbitMQ
    • 10.1 简单队列实现
    • 10.2 Work 模式(工作队列)
    • 10.3 公平分发
    • 10.4 RabbitMQ 消息应答与消息持久化
      • 消息应答
        • 概念
        • 配置
      • 消息持久化
        • 概念
        • 配置

十.RabbitMQ

10.1 简单队列实现

简单队列通常指的是一个基本的消息队列,它可以用于在生产者(生产消息的一方)和消费者(消费消息的一方)之间传递消息。

在这里插入图片描述

新创建Springboot项目

引入依赖

<dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.7.1</version>
 </dependency>

连接工具类

public class ConnectionUtils
{
    public static Connection getConnection()
    {
        try
        {
            Connection connection = null;
            //定义一个连接工厂
            ConnectionFactory factory = new ConnectionFactory();
            //设置服务端地址(域名地址/ip)
            factory.setHost("127.0.0.1");
            //设置服务器端口号
            factory.setPort(5672);
            //设置虚拟主机(相当于数据库中的库)
            factory.setVirtualHost("/");
            //设置用户名
            factory.setUsername("guest");
            //设置密码
            factory.setPassword("guest");
            connection = factory.newConnection();
            return connection;
        }
        catch (Exception e)
        {
            return null;
        }
    }
}

创建生产者

public class Provider01 {
    public static void main(String[] args) {

        try {
            System.out.println("--------生产者-------");

            // 获取连接
            Connection conn = ConnectionUtils.getConnection();
            //创建通道
            Channel channel = conn.createChannel();

            // 创建队列
            // 队列名称,是否持久化,是否排他,是否自动删除,其他参数
            channel.queueDeclare("test4072", false, false, false, null);

            // 定义发送信息
            String msg = "hello rabbitmq-kwh";

            // 发送数据
            channel.basicPublish("", "test4072", null, msg.getBytes());

            System.out.println("发送成功....");

            // 关闭资源
            channel.close();
            conn.close();


        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

创建消费者

public class Consumer01 {
    public static void main(String[] args) {

        try {

            System.out.println("======消费者======");

            // 获取连接
            Connection conn = ConnectionUtils.getConnection();
            //创建通道
            Channel channel = conn.createChannel();

            // 创建队列(有就直接连接。没有则创建)
            // 队列名称,是否持久化,是否排他,是否自动删除,其他参数
            channel.queueDeclare("test4072", false, false, false, null);

            // 消费者消费消息
            DefaultConsumer consumer = new DefaultConsumer(channel){
                @Override //一旦有消息进入 将触发
                public void handleDelivery(
                  String consumerTag,
                  Envelope envelope,                        
                  AMQP.BasicProperties properties,
                  byte[] body
                ) throws IOException {
                    String str = new String(body,"utf-8");
                    System.out.println("msg==接收=="+str);
                }
            };

            // 监听队列
            channel.basicConsume("test4072",true,consumer);

        }catch (Exception e) {
           e.printStackTrace();
        }

    }
}

10.2 Work 模式(工作队列)

工作队列的概念

  • 工作队列模式:生产者将任务发送到队列中,多个消费者从队列中取出任务并并行处理。这意味着,多个消费者可以共同工作来处理同一个队列中的任务。
  • 负载均衡:每个消费者只处理一个任务(消息),通过增加消费者数量,任务的处理可以并行化,提高整体处理能力。

工作队列的特点:

  1. 任务分配:RabbitMQ 将队列中的任务(消息)分配给可用的消费者,通常是按照“轮询”或“平衡”方式分配,即消费者可以公平地处理任务。
  2. 任务处理并行化:多个消费者可以并行地从同一个队列中消费消息,从而实现任务的并行处理,减轻单一消费者的负担。
  3. 消息丢失的风险低:通过合理配置队列和消息持久化机制,即使 RabbitMQ 重启,也能确保任务消息不丢失。

在这里插入图片描述

生产者

(只是在简单队列中的生产者中循环发送了信息。)

/**
 * Work 模式(工作队列)
 */
public class Provider01 {
    public static void main(String[] args) {

        try {

            System.out.println("--------生产者-------");

            // 获取连接
            Connection conn = ConnectionUtils.getConnection();
            //创建通道
            Channel channel = conn.createChannel();

            // 创建队列
            // 队列名称,是否持久化,是否排他,是否自动删除,其他参数
            channel.queueDeclare("test4072", false, false, false, null);

            for (int i = 0; i < 50; i++) {
                // 定义发送信息
                String msg = "hello rabbitmq-kwh"+i;
                // 发送数据
                channel.basicPublish("", "test4072", null, msg.getBytes());

                Thread.sleep(1000);

            }

            System.out.println("发送成功....");

            // 关闭资源
            channel.close();
            conn.close();


        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

消费者01

public class Consumer01 {
    public static void main(String[] args) {

        try {

            System.out.println("======消费者01======");

            // 获取连接
            Connection conn = ConnectionUtils.getConnection();
            //创建通道
            Channel channel = conn.createChannel();

            // 创建队列(有就直接连接。没有则创建)
            // 队列名称,是否持久化,是否排他,是否自动删除,其他参数
            channel.queueDeclare("test4072", false, false, false, null);

            // 消费者消费消息
            DefaultConsumer consumer = new DefaultConsumer(channel){
                @Override //一旦有消息进入 将触发
                public void handleDelivery(
                  String consumerTag,                     
                  Envelope envelope,                        
                  AMQP.BasicProperties properties,           
                  byte[] body
                ) throws IOException {
                    String str = new String(body,"utf-8");
                    System.out.println("msg==接收=="+str);
                }
            };

            // 监听队列
            channel.basicConsume("test4072",true,consumer);


        }catch (Exception e) {
           e.printStackTrace();
        }

    }
}

消费者02

public class Consumer02 {
    public static void main(String[] args) {

        try {

            System.out.println("======消费者02======");

            // 获取连接
            Connection conn = ConnectionUtils.getConnection();
            //创建通道
            Channel channel = conn.createChannel();

            // 创建队列(有就直接连接。没有则创建)
            // 队列名称,是否持久化,是否排他,是否自动删除,其他参数
            channel.queueDeclare("test4072", false, false, false, null);

            // 消费者消费消息
            DefaultConsumer consumer = new DefaultConsumer(channel){
                @Override //一旦有消息进入 将触发
                public void handleDelivery(
                  String consumerTag,                    
                  Envelope envelope,                       
                  AMQP.BasicProperties properties,
                  byte[] body
                ) throws IOException {
                    String str = new String(body,"utf-8");
                    System.out.println("msg==接收=="+str);
                }
            };

            // 监听队列
            channel.basicConsume("test4072",true,consumer);


        }catch (Exception e) {
           e.printStackTrace();
        }

    }
}

在这里插入图片描述

. 消费者 1 与消费者 2 处理的数据条数一样。

. 消费者 1 偶数 ;消费者 2 奇数

这种方式叫轮询分发(Round-robin)。

10.3 公平分发

指消息被均匀地分配给多个消费者,以便各个消费者的负载大致相等。通过这种方式,RabbitMQ 旨在避免某些消费者过载而其他消费者空闲的情况。

在这里插入图片描述

在10.2 中,现在有 2 个消费者,所有的奇数的消息都是繁忙的,而偶数则是轻松的。按照轮询的方式,奇数的任务交给了第一个消费者,所以一直在忙个不停。偶数的任务交给另一个消费者,则立即完成任务,然后闲得不行。而 RabbitMQ 则是不了解这些的。这是因为当消息进入队列,RabbitMQ 就会分派消息。它不看消费者为应答的数目,只是盲目的将消息发给轮询指定的消费者。

改造生产者

/*
同一时刻服务器只会发一条消息给消费者
1 限制发送给消费者不得超过一条消息
*/
channel.basicQos(1);
/**
 * 公平分发
 */
public class Provider01 {
    public static void main(String[] args) {

        try {

            System.out.println("--------生产者-------");

            // 获取连接
            Connection conn = ConnectionUtils.getConnection();
            //创建通道
            Channel channel = conn.createChannel();

            //同一时刻服务器只会发一条消息给消费者
            channel.basicQos(1);

            // 创建队列
            // 队列名称,是否持久化,是否排他,是否自动删除,其他参数
            channel.queueDeclare("test4072", false, false, false, null);

            for (int i = 0; i < 50; i++) {
                // 定义发送信息
                String msg = "hello rabbitmq-kwh"+i;
                // 发送数据
                channel.basicPublish("", "test4072", null, msg.getBytes());

                Thread.sleep(1000);

            }

            System.out.println("发送成功....");

            // 关闭资源
            channel.close();
            conn.close();


        } catch (Exception e) {
            e.printStackTrace();
        }


    }

}

消费者01

(在10.2 中消费者的基础上,只添加 channel.basicQos(1);,限制每次只消费一个消息)

public class Consumer01 {
    public static void main(String[] args) {

        try {

            System.out.println("======消费者01======");

            // 获取连接
            Connection conn = ConnectionUtils.getConnection();
            //创建通道
            Channel channel = conn.createChannel();

            //限制每次只消费一个消息
            channel.basicQos(1);

            // 创建队列(有就直接连接。没有则创建)
            // 队列名称,是否持久化,是否排他,是否自动删除,其他参数
            channel.queueDeclare("test4072", false, false, false, null);

            // 消费者消费消息
            DefaultConsumer consumer = new DefaultConsumer(channel){
                @Override //一旦有消息进入 将触发
                public void handleDelivery(
                  String consumerTag,                      
                  Envelope envelope,                     
                  AMQP.BasicProperties properties,
                  byte[] body
                ) throws IOException {
                    String str = new String(body,"utf-8");
                    System.out.println(envelope.getDeliveryTag()+"msg==接收=="+str);

                    // 休眠一秒钟
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }finally {
                        // 手动确认消息
                        // 第一个参数:消息的序号,
                        // 第二个参数:是否批量,false 单条消息应答 当为 true 时批量应答
                        channel.basicAck(envelope.getDeliveryTag(),false);
                    }

                }
            };

            // 监听队列
            // 自动应答设为 false
            channel.basicConsume("test4072",false,consumer);


        }catch (Exception e) {
           e.printStackTrace();
        }


    }
}

消费者02

(同消费者01)

在这里插入图片描述

消费者 1 休眠 1 秒,消费者 2 休眠 2 秒。

分别设置接收消息数,手动反馈,关闭自动应答

10.4 RabbitMQ 消息应答与消息持久化

消息应答

概念

**消息应答(ack)**是 RabbitMQ 中一个重要的机制,用于保证消息在被消费者处理后得以正确确认,确保消息不会丢失。如果消费者成功处理了消息,应该发送一个确认应答;如果消费者遇到问题或失败,则可以选择拒绝该消息,甚至重新放回队列供其他消费者处理。

应答类型:

  • **自动应答(auto-ack):**自动应答是默认设置,消费者从队列中获取消息后,RabbitMQ 会立即认为该消息已经被成功处理,即使消费者并未真正处理完成。在这种模式下,消息会在被消费后立即从队列中删除,而无需消费者确认。这种模式的缺点是,如果消费者在处理消息时崩溃,消息会丢失。
  • **手动应答(manual ack):**消费者处理完消息后,需要显式地发送确认应答,通知 RabbitMQ 该消息已经处理完成。这样,如果消费者没有发送确认应答,RabbitMQ 会重新将消息发送给其他消费者。
配置
// 监听队列
// 参数2:自动应答设为 false; true:开启自动应答
channel.basicConsume("test4072",false,consumer);

参数2为true时:自动确认

只要消息从队列中获取,无论消费者获取到消息后是否成功消费,都认为是消息已经成功消费。一旦rabbitmq 将消息分发给消费者,就会从内存中删除。(会丢失数据消息)

参数2为false时:手动确认

消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。如果有一个消费者挂掉,就会交付给其他消费者。手动告诉 rabbitmq 消息处理完成后,rabbitmq 删除内存中的消息。

反馈:

//手动回馈
channel.basicAck(envelope.getDeliveryTag(),false);

使用 Nack 让消息回到队列中

// 处理条数; 是否批量处理 ;是否放回队列 false 丢弃
channel.basicNack(envelope.getDeliveryTag(),false,true);

生产者

/**
 * 消息应答
 */
public class Provider01 {
    public static void main(String[] args) {

        try {
            System.out.println("--------生产者-------");
            // 获取连接
            Connection conn = ConnectionUtils.getConnection();
            //创建通道
            Channel channel = conn.createChannel();

            //同一时刻服务器只会发一条消息给消费者
            channel.basicQos(1);

            // 创建队列
            // 队列名称,是否持久化,是否排他,是否自动删除,其他参数
            channel.queueDeclare("test4072", false, false, false, null);

            for (int i = 0; i < 50; i++) {
                // 定义发送信息
                String msg = "hello rabbitmq-kwh"+i;
                // 发送数据
                channel.basicPublish("", "test4072", null, msg.getBytes());

                Thread.sleep(1000);

            }

            System.out.println("发送成功....");

            // 关闭资源
            channel.close();
            conn.close();


        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

消费者01

public class Consumer01 {
    public static void main(String[] args) {

        try {

            System.out.println("======消费者01======");

            // 获取连接
            Connection conn = ConnectionUtils.getConnection();
            //创建通道
            Channel channel = conn.createChannel();

            //限制每次只消费一个消息,防止通道中消息阻塞
            channel.basicQos(1);

            // 创建队列(有就直接连接。没有则创建)
            // 队列名称,是否持久化,是否排他,是否自动删除,其他参数
            channel.queueDeclare("test4072", false, false, false, null);

            // 消费者消费消息
            DefaultConsumer consumer = new DefaultConsumer(channel){
                @Override //一旦有消息进入 将触发
                public void handleDelivery(
                  String consumerTag,                       
                  Envelope envelope,                      
                  AMQP.BasicProperties properties,
                   byte[] body
                ) throws IOException {

                    String str = "";
                   try {
                        str = new String(body,"utf-8");
                       if(envelope.getDeliveryTag()==3){
                            int i=1/0;
                       }

                       System.out.println(envelope.getDeliveryTag()+"消费者01msg==接收=="+str);

                       //手动应答 处理完了
                       // 手动确认消息,即手动反馈
                       // 第一个参数:消息的序号,
                       // 第二个参数:是否批量,false 单条消息应答 ;当为 true 时批量应答
                       channel.basicAck(envelope.getDeliveryTag(),false);

                   }catch(Exception e){
                       // e.printStackTrace();
                       System.out.println("消费者01处理第"+envelope.getDeliveryTag()+"条,时报错,消息内容为"+str);

                       //手动应答 报错了
                       // 第一个参数:消息的序号,
                       // 第二个参数:是否批量,false 单条消息应答 当为 true 时批量应答
                       // 第三个参数:是否放回队列 ;false丢弃 ,true 放回队列
                        channel.basicNack(envelope.getDeliveryTag(),false,true);
                   }

                    // 休眠一秒钟
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
            };

            // 监听队列
            // 参数2:自动应答设为 false; true:开启自动应答
            channel.basicConsume("test4072",false,consumer);


        }catch (Exception e) {
           e.printStackTrace();
        }

    }
}

消费者02(同消费者01)

在这里插入图片描述

消息持久化

概念

RabbitMQ 的持久化机制是确保消息和队列在系统崩溃、重启或其他故障情况下不会丢失的关键功能。确保消息不会丢失需要做两件事:将队列和消息都标记为持久化。

配置

持久化队列

// 创建队列,
// 队列名称,是否持久化(队列),是否排他,是否自动删除,其他参数
 channel.queueDeclare("test4072", true, false, false, null);

消息持久化

// 发送数据
// MessageProperties.PERSISTENT_TEXT_PLAIN:持久化消息
//设置生成者发送消息为持久化信息(要求保存到硬盘上)保存在内存中
//MessageProperties.PERSISTENT_TEXT_PLAIN,指令完成持久化
channel.basicPublish("", "test4072", MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());

如果改动队列参数配置,需要删除原有的队列,重新建,因为在 rabbitmq 是不允许重新定义一个已存在的队列。

在这里插入图片描述

生产者

/**
 * 消息持久化
 */
public class Provider01 {
    public static void main(String[] args) {

        try {

            System.out.println("--------生产者-------");

            // 获取连接
            Connection conn = ConnectionUtils.getConnection();
            //创建通道
            Channel channel = conn.createChannel();

            //同一时刻服务器只会发一条消息给消费者
            channel.basicQos(1);

            // 创建队列
            // 队列名称,是否持久化(队列),是否排他,是否自动删除,其他参数
            channel.queueDeclare("test4072", true, false, false, null);

            for (int i = 0; i < 50; i++) {
                // 定义发送信息
                String msg = "hello rabbitmq-kwh"+i;

                // 发送数据
                // MessageProperties.PERSISTENT_TEXT_PLAIN:持久化消息
                channel.basicPublish("", "test4072", MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());

                Thread.sleep(1000);

            }

            System.out.println("发送成功....");

            // 关闭资源
            channel.close();
            conn.close();


        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nexus docker安装

#nexus docker 安装 docker pull sonatype/nexus3 mkdir -p /data/nexus-data docker run -itd -p 8081:8081 --privilegedtrue --name nexus3 \ -v /data/nexus-data:/var/nexus-data --restartalways docker.io/sonatype/nexus3 #访问 http://192.168.31.109:8081/ 用户名&am…

ADC(二):外部触发

有关ADC的基础知识请参考标准库入门教程 ADC&#xff08;二&#xff09;&#xff1a;外部触发 1、TIM1的CC1事件触发ADC1DMA重装载2、TIM3的TRGO事件(的更新事件)触发ADC1DMA重装载3、TIM3的TRGO事件(的捕获事件)触发ADC1DMA重装载4、优化TIM3的TRGO事件(的捕获事件)触发ADC1D…

【产品应用】一体化无刷电机在旋转等离子喷枪中的应用

在现代工业制造与加工领域&#xff0c;等离子喷枪凭借其高温、高速的等离子射流&#xff0c;能够实现高效的材料表面处理、切割以及焊接等工艺&#xff0c;在众多行业中发挥着关键作用。而一体化无刷电机的应用&#xff0c;更是为等离子喷枪的性能提升和稳定运行注入了强大动力…

ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制

文章目录 Pre概述什么是 composite aggregation&#xff1f;基本结构after 参数的作用问题背景&#xff1a;传统分页的重复问题after 的设计理念响应示例 after 如何确保数据不重复核心机制Example步骤 1: 创建测试数据创建索引插入测试数据 步骤 2: 查询第一页结果查询第一页返…

易基因: BS+ChIP-seq揭示DNA甲基化调控非编码RNA(VIM-AS1)抑制肿瘤侵袭性|Exp Mol Med

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 肝细胞癌&#xff08;hepatocellular carcinoma&#xff0c;HCC&#xff09;早期复发仍然是一个具有挑战性的领域&#xff0c;其中涉及的机制尚未完全被理解。尽管微血管侵犯&#xff08…

顶会评测集解读-AlignBench: 大语言模型中文对齐基准

评测集社区 CompssHub 作为司南 OpenCompass大模型评测体系的重要组成部分&#xff0c;致力于简化并加快研究人员和行业人士搜索和使用评测集的过程。评测集社区 CompssHub 目前已收录了学科、推理、知识、代码等12个方向的评测集&#xff0c;欢迎大家探索。 为了将评测集社区…

量子退火与机器学习(1):少量数据求解未知QUBO矩阵,以少见多

文章目录 前言ー、复习QUBO&#xff1a;中药配伍的复杂性1.QUBO 的介入&#xff1a;寻找最佳药材组合 二、难题&#xff1a;QUBO矩阵未知的问题1.为什么这么难&#xff1f; 三、稀疏建模(Sparse Modeling)1. 欠定系统中的稀疏解2. L1和L2的选择&#xff1a; 三、压缩感知算法(C…

Linux应用软件编程-多任务处理(线程)

线程&#xff1a;轻量级的进程&#xff0c;线程的栈区独立&#xff08;8M&#xff09;&#xff0c;与同一进程中的其他线程共用进程的堆区&#xff0c;数据区&#xff0c;文本区。 进程是操作系统资源分配的最小单位&#xff1b;线程是cpu任务调度的最小单位。 1. 线程的创建…

IKAnalyzer分词组件

IKAnalyzer是一个功能强大、易于使用、性能优异的中文分词工具包&#xff0c;适用于各种需要进行中文分词的场景&#xff0c;如搜索引擎、自然语言处理、文本挖掘等。 Springboot如何集成IKAnalyzer分词组件 引入IKAnalyzer分词组件包 <dependency><groupId>org…

微信小程序 不同角色进入不同页面、呈现不同底部导航栏

遇到这个需求之前一直使用的小程序默认底部导航栏&#xff0c;且小程序默认入口页面为pages/index/index&#xff0c;要使不同角色呈现不同底部导航栏&#xff0c;必须要在不同页面引用不同的自定义导航栏。本篇将结合分包&#xff08;subPackages&#xff09;展开以下三步叙述…

输入框去掉角标

前言 正常情况下&#xff0c;HTML textarea 多行文本输入框会存如下图所示图标&#xff0c; 用户可拉动它改变高度&#xff0c;这是我们不想看到的&#xff0c;所以要去掉它。 去掉后&#xff1a; 解决方案 设置 resize 属性即可&#xff0c;如下代码所示&#xff1a; <…

ping指令的实现与icmp协议的讲解

icmp协议 icmp属于一个网络层的协议&#xff0c;一般被封装到IP报文中&#xff0c;主要功能是如果IP报文出现目的地不可达&#xff0c;时间超过等情况出现时&#xff0c;就会将返回一个差错检测报文&#xff0c;里面包括了IP报文丢失的原因 常见的报错信息有 目的地不可达时间…

Log4j2的Policies详解、SizeBasedTriggeringPolicy、TimeBasedTriggeringPolicy

文章目录 一、Policies二、SizeBasedTriggeringPolicy:基于文件大小的滚动策略2.1、文件达到指定大小就归档 三、TimeBasedTriggeringPolicy&#xff1a;基于时间间隔的滚动策略3.1、验证秒钟归档场景3.2、验证分钟场景3.3、验证小时场景 四、多策略组合使用五、扩展知识5.1、S…

SpringCloudAlibaba实战入门之路由网关Gateway初体验(十一)

Spring Cloud 原先整合 Zuul 作为网关组件,Zuul 由 Netflix 公司提供的,现在已经不维护了。后面 Netflix 公司又出来了一个 Zuul2.0 网关,但由于一直没有发布稳定版本,所以 Spring Cloud 等不及了就自己推出一个网关,已经不打算整合 zuul2.0 了。 一、什么是网关 1、顾明…

#渗透测试#漏洞挖掘#红蓝攻防#常见未授权访问漏洞汇总

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

Fast adaptively balanced min-cut clustering

#0.论文信息 标题&#xff1a;Fast adaptively balanced min-cut clustering期刊&#xff1a;Pattern Recognition作者: Feiping Nie , Fangyuan Xie , Jingyu Wang ,Xuelong Li机构: China Telecom, Northwestern Polytechnic al University.代码链接&#xff1a; #1.摘要 …

【C++】——精细化哈希表架构:理论与实践的综合分析

先找出你的能力在哪里&#xff0c;然后再决定你是谁。 —— 塔拉韦斯特弗 《你当像鸟飞往你的山》 目录 1. C 与哈希表&#xff1a;核心概念与引入 2. 哈希表的底层机制&#xff1a;原理与挑战 2.1 核心功能解析&#xff1a;效率与灵活性的平衡 2.2 哈希冲突的本质&#x…

前端技术(26) : 全年排班日历

来源: 通义千问 效果图 代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>年度日历</title><style>body {font-family: Arial, sans-serif;}.calendar-container {margin: 20px au…

QT-------认识QT

QT简介 QT是一个跨平台的C图形用户界面应用程序框架&#xff0c;由挪威Trolltech公司于1991年开发并发布。它为开发者提供了一套丰富的类库和工具&#xff0c;用于创建各种类型的应用程序&#xff0c;包括桌面应用、移动应用、嵌入式系统应用等。QT具有高度的可定制性和可扩展…

Hive 部署

1 下载并安装 1.1 Hadoop安装 参考另一篇博客&#xff1a;Hadoop 部署 1.2 安装包下载 可通过下面网站下载&#xff1a; 官网&#xff1a;https://dlcdn.apache.org/hive/。清华源&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/apache/hive/。 比如下载apache-hive-4…