【八股战神篇】RabbitMQ高频面试题

news2025/5/29 10:18:23

简述RabbitMQ五种模式 ?

延伸

请介绍一下RabbitMQ的特点

延伸

简述RabbitMQ的发布与订阅模式

延伸

RabbitMQ 如何保证消息不丢失?

延伸

RabbitMQ 如何保证消息有序?

延伸


专栏简介

八股战神篇专栏是基于各平台共上千篇面经,上万道面试题,进行综合排序提炼出排序前百的高频面试题,并对这些高频八股进行关联分析,将每个高频面试题可能进行延伸的问题进行分析排序选出高频延伸八股题。面试官都是以点破面从一个面试题不断深入,目的是测试你的理解程度。本专栏将解决你的痛点,助你从容面对。本专栏已更新Java基础高频面试题、Java集合高频面试题、MySQL高频面试题、JUC 并发高频面试题、JVM高频面试题、Spring高频面试题,Redis高频面试题、操作系统高频面试题,后续会继续更新计算机网络、设计模式、场景题、RocketMQ等,计划在七月前更新完毕,点此链接订阅专栏“八股战神篇”。

简述RabbitMQ五种模式 ?

RabbitMQ支持多种消息传递模式,通过不同的交换器类型和队列的配置,能够满足各种应用场景的需求。以下是RabbitMQ的五种常见模式:

  1. 点对点(Point-to-Point)模式:也称为队列模式,生产者将消息发送到一个队列,消费者从该队列中消费消息。这种模式适用于任务分配场景,多个消费者共享队列中的任务,通常每个任务只会被一个消费者处理。
  2. 发布/订阅(Publish/Subscribe)模式:也称为广播模式,生产者将消息发送到一个交换器,交换器将消息广播到所有绑定的队列。消费者通过绑定队列来接收消息。适用于需要将同一条消息发送给多个消费者的场景。

  3. 路由(Routing)模式:在Direct Exchange(直连交换器)中,生产者将消息发送到一个交换器,交换器根据路由键将消息路由到绑定的队列。消费者根据路由键精确地接收消息,适用于根据消息内容进行精确匹配的场景。

  4. 主题(Topic)模式:在Topic Exchange(主题交换器)中,交换器使用带有通配符的路由键对消息进行路由。消费者可以根据主题匹配特定的消息,适用于复杂的多维路由规则。

  5. 头部(Headers)模式:在Headers Exchange(头交换器)中,交换器根据消息的头部属性而非路由键来路由消息。消费者根据消息的属性进行过滤,适用于需要基于多种属性进行路由的场景。

延伸

  1. 点对点(Point-to-Point)模式:
    • 工作原理:生产者将消息发送到某个队列,队列中的消息被消费者消费。每条消息只会被一个消费者处理。这是RabbitMQ最基础的模式,适用于任务调度和负载均衡的场景。
    • 应用场景:多个消费者从同一队列中获取消息,每个消费者处理一个任务,保证了任务的分发与负载均衡。举个例子,一个图像处理应用,多个消费者可以从同一个队列中获取图像处理任务,每个任务只由一个消费者完成。
  2. 发布/订阅(Publish/Subscribe)模式:
    • 工作原理:生产者将消息发送到一个交换器,交换器将消息广播到所有绑定的队列。消费者通过绑定到队列来接收消息,这样多个消费者可以接收到同一条消息。
    • 应用场景:这种模式非常适合消息广播场景,比如推送通知系统,其中消息需要广播给多个客户端。举个例子,假设你有一个实时新闻推送系统,每个用户设备都订阅了特定的新闻频道,当生产者推送新闻时,所有订阅了该频道的设备都会收到这条新闻。
  3. 路由(Routing)模式:
    • 工作原理:生产者将消息发送到一个Direct Exchange(直连交换器),交换器根据消息的路由键将消息投递到匹配的队列。每个队列可以与一个或多个路由键绑定,只有匹配的路由键的消息会被投递到相应的队列。
    • 应用场景:这种模式适用于需要精确路由消息的场景。举个例子,在一个日志收集系统中,可以将不同类型的日志(如“error”,“info”)发送到不同的队列,分别由不同的消费者进行处理。
  4. 主题(Topic)模式:
    • 工作原理:生产者将消息发送到Topic Exchange(主题交换器),交换器根据消息的路由键和队列的绑定规则进行路由。路由键支持通配符(* 和 #),使得消费者可以根据模式匹配接收消息。*匹配单个词,#匹配多个词。
    • 应用场景:适用于需要灵活和复杂的消息路由规则的场景。举个例子,一个股票市场监控系统,股票价格可以按市场、行业和股票类型进行分类,消费者可以订阅“stock.usd.”来接收所有美元交易的股票数据,或者订阅“stock..tech”来接收科技类股票的数据。
  5. 头部(Headers)模式:
    • 工作原理:生产者将消息发送到Headers Exchange(头交换器),交换器根据消息的头部属性进行路由。队列与交换机之间的绑定通过消息的头部属性来进行匹配,而不是通过路由键。
    • 应用场景:这种模式适用于需要基于多个属性对消息进行过滤和路由的场景。例如,消息可以根据消息头中的“type”、“category”、“priority”等属性进行路由。举个例子,在订单管理系统中,订单消息可以根据订单的“类型”和“优先级”进行路由,确保高优先级的订单被快速处理。

请介绍一下RabbitMQ的特点

RabbitMQ 是一种基于 AMQP(高级消息队列协议)的开源消息中间件,广泛应用于分布式系统中的异步通信和削峰解耦。RabbitMQ 的核心设计基于生产者-消费者模型,通过消息队列实现消息的传递和处理。接下来我将详细讲述RabbitMQ 的八个特点

第一是高可靠性,支持消息持久化、消息确认机制和事务机制,确保消息不会丢失。

第二是路由机制较为灵活,通过交换机和绑定规则,支持多种消息分发模式(如直连、广播、主题等)。

第三是高可用性,支持集群部署和镜像队列,提升系统的容灾能力。

第四是扩展性强,能够轻松应对高并发场景,并支持插件扩展功能。

第五是支持多种协议,RabbitMQ兼容AMQP、STOMP、MQTT等多种消息协议,便于与不同系统集成。

第六是支持多语言客户端库,提供Java、Python、.NET等多语言的客户端库,方便开发者使用。

第七是自带Web管理界面,方便监控和管理服务器状态及操作。

第八是插件丰富,支持安装各种插件,扩展功能如消息追踪、性能监控等。

延伸

1.RabbitMQ的整体模型

(1)Producer(生产者)

定义:生产者是发布消息的应用程序。它将消息发送到消息队列中,并指定要发送的消息内容和相关的路由信息。生产者不关心消息的具体去向,它仅仅是将消息传递给交换器。

作用:生产者的主要作用是生成消息并将消息推送到RabbitMQ中。在我们的图示中,Producer1 和 Producer2 会将消息发送到各自的交换器(Exchange1 和 Exchange2)。这些消息会被传递到消息队列(如 Queue1 或 Queue2),由消费者进行消费。

(2)Consumer(消费者)

定义:消费者是从消息队列中获取消息并进行处理的应用程序或服务。消费者订阅队列,并从队列中取出消息进行消费。

作用:消费者从队列中提取消息并根据消息内容执行相应的处理。多个消费者可以并行消费队列中的消息,RabbitMQ 会将消息分配给空闲的消费者。上图中,Consumer1、Consumer2 和 Consumer3 就是从 Queue1 和 Queue2 中消费消息的客户端。每个消费者通常会有一定的逻辑来处理接收到的消息,例如数据处理、业务逻辑计算或调用其他服务。

(3)Exchange(交换器)

定义:Exchange 是 RabbitMQ 的核心组件,它负责接收生产者发送的消息,并根据一定的规则将消息路由到不同的队列中。交换器不保存消息,只是负责将消息转发到相应的队列。

作用:生产者将消息发送到交换器,交换器再根据消息的路由规则将消息推送到一个或多个队列。交换器的类型决定了它如何处理这些消息。上图中的 Exchange1 和 Exchange2 接收来自生产者的消息并根据不同的类型将它们分发到队列中。

(4)Exchange 的绑定(Binding)

Exchange 路由消息的过程与队列的绑定方式密切相关。交换器通过 Binding(绑定) 将队列与自己关联起来。绑定是 Exchange 与队列之间的连接,通常会有一个路由键来指定绑定的规则。

直接绑定:Direct Exchange 会通过路由键直接将消息发送到与该路由键匹配的队列。

模式匹配绑定:Topic Exchange 允许使用通配符进行模式匹配绑定,基于消息的路由键来决定队列是否接收消息。

(5)Exchange Types(交换器类型)

RabbitMQ 提供了多种交换器类型,下面是每种类型的详细说明:

Direct Exchange(直接交换器):直接交换器将消息路由到与其路由键完全匹配的队列。适用于生产者和消费者之间需要进行精准匹配的场景。比如,我们可以使用路由键 email 来将发送电子邮件的消息直接路由到专门处理电子邮件的队列中。每个队列都会与交换器绑定,并指定一个路由键。当生产者发布消息时,交换器会根据消息中的路由键将消息推送到与该路由键匹配的队列。

Fanout Exchange(扇形交换器):扇形交换器将收到的消息广播到所有与其绑定的队列,而不管消息中的路由键是什么。适用于广播消息的场景,比如一个通知系统,消息需要传递给多个消费者,所有消费者都能收到消息。无论消息的路由键是什么,所有绑定到该扇形交换器的队列都会收到该消息。

Topic Exchange(主题交换器):主题交换器根据路由键的模式将消息路由到多个队列。路由键支持通配符 *(匹配单个词)和 #(匹配多个词)。适用于复杂的消息路由场景,例如不同类型的日志信息需要发送到不同的消费者,消费者根据感兴趣的主题进行选择。生产者将消息发送到交换器并指定一个路由键,交换器通过匹配路由键的模式将消息转发到与之匹配的队列。

Headers Exchange(头交换器):头交换器根据消息的头部属性进行路由,而不仅仅依赖路由键。适用于需要根据消息的多个属性进行过滤和路由的场景,比如发送消息时附带多个属性,如消息的类型、来源等。消息发送到交换器时,交换器会根据消息头部的属性来决定将消息路由到哪个队列。

(6)Queue(消息队列)

定义:消息队列是用于存储消息的容器,消息队列在 RabbitMQ 中充当了缓冲区的角色,消息会在队列中排队等待消费者进行处理。每个队列可以同时有多个生产者向其发送消息,也可以有多个消费者来消费消息。

作用:队列的作用是暂时存储消息,并确保消息不会丢失,直到它们被消费者取走。队列确保消息按照先进先出的顺序进行消费,除非使用了其他特殊的路由和策略。上图中的 Queue1 和 Queue2 是两个队列,分别接收来自不同交换器的消息。

(7)Broker(消息中间件的服务节点)

定义:Broker 是指 RabbitMQ 消息队列服务的核心组件,负责管理消息的发送、接收、路由等工作。它协调消息的流动,并处理生产者和消费者之间的通信。

作用:Broker 是 RabbitMQ 系统的“中介”,它接收来自生产者的消息,决定如何将消息路由到队列,并最终确保消费者能够收到这些消息。Broker 的责任还包括管理交换器、队列的配置和消息的持久化(如果启用了持久化)。

简述RabbitMQ的发布与订阅模式

RabbitMQ中的发布/订阅模式(Publish/Subscribe)是通过Fanout Exchange(扇出交换器)来实现的。在这种模式下,生产者将消息发送到交换器,交换器会将消息广播到所有与其绑定的队列,而不考虑消息的路由键。每个消费者通过绑定队列接收消息,从而实现多个消费者订阅同一消息源的功能。

延伸

发布/订阅模式通过Fanout Exchange(扇出交换器)实现,适用于需要广播消息到多个消费者的场景。以下是对这一模式的详细解释:

  1. Fanout Exchange(扇出交换器)
    • Fanout Exchange是RabbitMQ中专门用于实现发布/订阅模式的交换器类型。在Fanout Exchange中,生产者将消息发送到交换器时,交换器会将消息广播到所有与其绑定的队列,而不使用路由键。也就是说,消息将被广播到所有绑定了该交换器的队列中。
    • 这种机制的优点是生产者不需要关注消息的具体目标消费者,交换器自动将消息广播到所有订阅的队列。
  2. 发布与订阅
    • 发布(Publish):生产者将消息发布到Fanout Exchange,消息进入交换器后会被自动广播到所有与该交换器绑定的队列。
    • 订阅(Subscribe):消费者通过绑定自己的队列到Fanout Exchange,从而接收交换器广播的消息。每个消费者都会收到交换器广播的消息,不管队列中是否存在路由键。
  3. 应用场景
    • 发布/订阅模式通常用于需要广播消息到多个消费者的场景。例如,在一个消息推送系统中,可能需要将同一条消息同时发送给多个订阅者。再如,实时新闻推送、股票价格更新等场景,都可以使用发布/订阅模式来确保所有订阅者都接收到消息。
    • 举个例子,在一个天气预报系统中,当有新的天气信息产生时,所有订阅了天气预报的消费者(比如手机、网站等客户端)都会实时收到该消息。
  4. 多消费者并行消费
    • 在发布/订阅模式下,多个消费者可以并行地从不同的队列中消费消息,每个队列的消费者将独立地处理各自队列中的消息。这种机制帮助实现消息的并行处理,提高系统的吞吐量和处理能力。
  5. 性能和扩展性
    • 由于消息被广播到所有队列,发布/订阅模式特别适用于需要消息同时发送给多个接收者的应用,保证了每个订阅者都能接收到消息。这种方式使得系统能够轻松扩展,只需将更多的队列绑定到交换机即可支持更多的消费者。
  6. 队列与交换器的绑定
    • 在RabbitMQ中,消费者需要将自己的队列与Fanout Exchange绑定。这样,每个消费者的队列都能够接收到由交换器广播的消息。不同的消费者可以订阅不同的队列,消费它们所需的消息内容。

RabbitMQ 如何保证消息不丢失?

为了确保消息在传输过程中不丢失,RabbitMQ 提供了一系列机制来保障消息的可靠传递。接下来我会从生产者到 RabbitMQ、RabbitMQ 自身、以及 RabbitMQ 到消费者的三个阶段详细讲述如何实现消息不丢失。

第一个是消息从生产者到 RabbitMQ 的阶段,RabbitMQ 提供了两种机制来保证消息的可靠性,这两种机制是互斥的,不能同时使用,否则会导致 RabbitMQ 报错。

一个是事务机制,

生产者通过开启事务(channel.txSelect()),可以确保消息被成功写入 RabbitMQ。

如果消息写入失败,事务会回滚(channel.txRollback()),生产者可以重新发送消息。

事务机制虽然可靠,但性能较低,因为每次发送消息都需要等待 RabbitMQ 的确认。

另一个是 Confirm 机制,

这是一种轻量级的可靠性保障方式。生产者将信道设置为 Confirm 模式后,每条消息都会被分配一个唯一的 ID。

当消息成功写入 RabbitMQ 后,RabbitMQ 会返回一个确认(ACK)。如果消息未能成功写入,RabbitMQ 会返回一个 NACK,生产者可以根据需要重试发送。

Confirm 机制相比事务机制性能更高,适用于高吞吐量的场景。

第二个是消息在 RabbitMQ 中的阶段,RabbitMQ 自身提供了两种机制来确保消息的安全性和可靠性。

一个是持久化,

生产者可以将消息标记为“持久化”模式(deliveryMode=2),RabbitMQ 会将消息写入磁盘,而不是仅存储在内存中。

同时,队列也需要配置为持久化(durable=true),以确保队列本身在 RabbitMQ 重启后仍然存在。

另一个是集群与镜像模式,

RabbitMQ 支持集群部署,分为普通模式和镜像模式。

对于普通模式,消息只存储在主节点上,适合对性能要求较高的场景,但存在单点故障的风险。

而对于镜像模式,消息会在多个节点之间同步,即使某个节点宕机,其他节点仍然可以接管服务,从而避免消息丢失。镜像模式虽然提高了可靠性,但会增加网络开销和存储成本。

第三个是消息从 RabbitMQ 到消费者的阶段,

最后,在消费者从 RabbitMQ 获取消息的过程中,RabbitMQ 提供了三种机制来确保消息被正确消费。

第一个是BasicAck 机制,

消费者在处理完消息后,需要显式地向 RabbitMQ 发送确认(basicAck)。

如果消费者在处理消息时发生异常(如崩溃或网络中断),RabbitMQ 会将消息重新投递给其他消费者或等待当前消费者恢复后再次投递。

第二个是死信队列(Dead Letter Queue,DLQ),

对于多次重试仍无法消费成功的消息,RabbitMQ 会将其转移到死信队列。

死信队列可以用于后续人工排查和处理,避免消息被直接丢弃。

第三个是消息补偿机制,

在某些场景下,消费者可能会因为网络问题或自身故障导致消息未被正确处理。

可以结合业务逻辑设计消息补偿机制,例如通过定时任务定期检查未处理的消息,并重新触发消费。

延伸

1.发送消息时 RabbitMQ 的工作流程

(1)建立连接与信道

生产者首先与 RabbitMQ Broker 建立一个 TCP 连接(Connection),并在该连接上创建一个信道(Channel)。信道是轻量级的通信通道,用于在生产者和 RabbitMQ 之间传递消息。

(2)声明交换器与队列

生产者声明一个交换器(Exchange),并指定其类型(如直连、主题、扇出等)以及持久化属性等。

同时,生产者还需要声明一个队列,并设置队列的属性(如是否持久化、是否为排他性、是否自动删除等)。

(3)绑定交换器与队列

通过绑定键(bindingKey)将交换器与队列绑定,建立路由规则。这样,交换器就能够按照路由规则将消息转发到相应的队列。

(4)发送消息至 Broker

生产者将消息发送到 RabbitMQ Broker,消息中需要包含以下信息:

Routing Key(路由键):用于与绑定规则进行匹配。

目标交换器名称:指定消息发送到哪个交换器。

消息体(Payload)及可选的属性(如消息头、优先级等)。

(5)消息路由与存储

交换器根据路由键和绑定规则来匹配目标队列: 匹配成功,消息被成功存储到目标队列中。匹配失败,根据生产者配置的 mandatory 或 alternate-exchange 属性,决定是否丢弃消息或将其退回。

(6)资源释放(可选)

消息发送完成后,生产者可以选择关闭信道和 TCP 连接。在实际生产环境中,通常会复用长连接以提高性能,避免频繁的连接建立和关闭操作。

2.接收消息时 RabbitMQ 的工作流程

(1)建立连接与信道

消费者首先与 RabbitMQ Broker 建立一个 TCP 连接(Connection),并在该连接上创建一个信道(Channel)。信道是消费者与 RabbitMQ 之间的通信通道,用于接收消息。

(2)声明队列

消费者声明一个队列(Queue),并设置队列的属性(如是否持久化、是否为排他性、是否自动删除等)。如果该队列已经存在,RabbitMQ 会忽略声明操作。

(3)绑定交换器与队列

消费者通过绑定(Binding)将队列与一个交换器关联起来。消费者可以指定一个路由键(bindingKey),这将决定队列接收到哪些消息。该绑定规则会根据交换器的类型和路由键的匹配来决定消息的路由。

(4)开始消费消息

消费者通过信道(Channel)向 RabbitMQ 请求消费消息。消费者可以选择以 同步 或 异步 的方式消费消息。同步方式会阻塞直到消息被处理完毕,而异步方式则允许消费者同时处理多个消息。

(5)消息接收与确认

消息到达消费者队列时,RabbitMQ 将消息从队列中取出并交给消费者处理。

如果消费者启用了消息确认机制(acknowledgement),它在成功处理消息后需要向 RabbitMQ 发送一个确认信号(ack)。如果消费者在处理消息时发生故障,RabbitMQ 会根据配置将消息重新投递给其他消费者。

(6)处理消息

消费者从队列中接收到消息后,执行相应的业务逻辑来处理消息内容。处理可以是数据计算、请求外部服务等,具体取决于消费者的业务需求。

(7)消息确认与应答

手动确认:消费者在成功处理消息后,显式地向 RabbitMQ 发送确认(ack),告知 Broker 该消息已成功消费,可以从队列中删除。

自动确认:消费者在接收到消息后会自动确认,RabbitMQ 会立即将消息从队列中移除。

(8)处理失败的消息(可选)

如果消费者在处理消息时发生错误,且未启用自动确认机制,消费者可以发送 nack(negative acknowledgment),告知 RabbitMQ 该消息处理失败。RabbitMQ 可以选择将该消息重新排入队列或将其丢弃,具体行为取决于 requeue 设置。

(9)资源释放(可选)

消费者完成消息处理后,可以选择关闭信道和 TCP 连接。与生产者类似,在生产环境中,消费者通常会复用连接和信道以提高性能,减少资源开销。

RabbitMQ 如何保证消息有序?

RabbitMQ 保证消息有序性时,有时会面临多个消费者并发消费的情况。为了解决这个问题,我们可以通过拆分多个队列或者设计一个单独的消费者来确保消息顺序。

一种方法是将消息分发到多个队列中,每个队列对应一个消费者。通过拆分多个队列,确保每个消费者只消费一个队列中的消息。虽然这种方法可以有效保证每个队列内的消息顺序,但也带来了额外的复杂性和管理成本,因为我们需要为每个消费者创建一个独立的队列。

另一种方法是使用单个队列,但仅允许一个消费者进行消费。在这种设计中,消费者内部维护一个内存队列,确保消息的顺序被正确排队。这个消费者负责从队列中获取消息后,将其按照顺序排入内存队列,再由底层的多个工作线程(worker)并发处理这些消息。通过这种方式,我们能保持队列的顺序不变,并通过工作线程来提高处理效率,同时避免了拆分多个队列的麻烦。

延伸

1.操作系统中的消息队列如何保证消息有序?

(1)FIFO 基础机制

操作系统内核实现的消息队列(如 POSIX 消息队列或 System V 消息队列)默认采用先进先出(FIFO)策略。消息按发送顺序被接收方读取,确保基本的顺序性。例如,若进程 A 先发送消息 M1,再发送 M2,进程 B 会按 M1→M2 的顺序接收。

(2)单一生产者-消费者模式

单线程处理:若同一队列仅由一个生产者发送消息,且一个消费者单线程读取消息,则无需额外控制即可天然保证顺序。

同步机制:若需多线程/进程操作队列,需通过互斥锁(Mutex)或信号量确保同一时间只有一个线程/进程访问队列,避免并发导致的乱序。

(3)消息优先级的影响

部分操作系统允许为消息设置优先级(如 POSIX 消息队列的 mq_send 可指定优先级)。此时,高优先级消息会优先被消费,这会破坏严格 FIFO 顺序。若需全局有序,需禁用优先级或确保所有消息使用相同优先级。

(4)业务层顺序控制

消息分组与编号:生产者可为相关消息添加唯一标识或序列号(如订单操作需按步骤 1→2→3 执行),消费者通过校验序列号处理乱序消息。

原子操作:通过 msgsnd 和 msgrcv 系统调用的原子性,确保消息的发送和接收不可中断,避免中间状态导致的顺序问题。

(5)与应用层消息队列的对比

操作系统消息队列的有序性依赖内核实现,而分布式消息中间件(如 RabbitMQ、Kafka)需额外机制(如分区单线程消费、全局顺序 Topic)保证跨网络的顺序。操作系统层面的队列更适用于单机进程间通信的轻量级场景。

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

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

相关文章

高阶数据结构——红黑树实现

目录 1.红黑树的概念 1.1 红黑树的规则: 1.2 红黑树的效率 2.红黑树的实现 2.1 红黑树的结构 2.2 红黑树的插入 2.2.1 不旋转只变色(无论c是p的左还是右,p是g的左还是右,都是一样的变色处理方式) 2.2.2 单旋变色…

安卓学习笔记-声明式UI

声明式UI Jetpack Compose 是 Google 推出的用于构建 Android UI 的现代化工具包。它采用 声明式编程模型(Declarative UI),用 Kotlin 编写,用于替代传统的 XML View 的方式。一句话概括:Jetpack Compose 用 Kotlin…

AI天气预报进入“大模型时代“:如何用Transformer重构地球大气模拟?

引言:从数值预报到AI大模型的范式变革 传统的天气预报依赖于数值天气预报(NWP, Numerical Weather Prediction),通过求解大气动力学方程(如Navier-Stokes方程)进行物理模拟。然而,NWP计算成本极高,依赖超级计算机,且难以处理小尺度天气现象(如短时强降水)。 近年来…

数据结构第3章 线性表 (竟成)

目录 第 3 章 线性表 3.1 线性表的基本概念 3.1.1 线性表的定义 3.1.2 线性表的基本操作 3.1.3 线性表的分类 3.1.4 习题精编 3.2 线性表的顺序存储 3.2.1 顺序表的定义 3.2.2 顺序表基本操作的实现 1.顺序表初始化 2.顺序表求表长 3.顺序表按位查找 4.顺序表按值查找 5.顺序表…

JAVA面试复习知识点

面试中遇到的题目,记录复习(持续更新) Java基础 1.String的最大长度 https://www.cnblogs.com/wupeixuan/p/12187756.html 2.集合 Collection接口的实现: List接口:ArraryList、LinkedList、Vector Set接口&#xff1a…

项目中的流程管理之Power相关流程管理

一、低功耗设计架构规划(Power Plan)   低功耗设计的起点是架构级的电源策略规划,主要包括:   电源域划分   基于功能模块的活跃度划分多电压域(Multi-VDD),非关键模块采用低电压&#xf…

SLOT:测试时样本专属语言模型优化,让大模型推理更精准!

SLOT:测试时样本专属语言模型优化,让大模型推理更精准! 大语言模型(LLM)在复杂指令处理上常显不足,本文提出SLOT方法,通过轻量级测试时优化,让模型更贴合单个提示。实验显示&#x…

《计算机组成原理》第 10 章 - 控制单元的设计

目录 10.1 组合逻辑设计 10.1.1 组合逻辑控制单元框图 10.1.2 微操作的节拍安排 10.1.3 组合逻辑设计步骤 10.2 微程序设计 10.2.1 微程序设计思想的产生 10.2.2 微程序控制单元框图及工作原理 10.2.3 微指令的编码方式 1. 直接编码(水平型) 2.…

【数据结构与算法】模拟

成熟不是为了走向复杂,而是为了抵达天真;不是为了变得深沉,而是为了保持清醒。 前言 这是我自己刷算法题的第五篇博客总结。 上一期笔记是关于前缀和算法: 【数据结构与算法】前缀和-CSDN博客https://blog.csdn.net/hsy1603914691…

PyTorch入门-torchvision

torchvision torchvision 是 PyTorch 的一个重要扩展库,专门针对计算机视觉任务设计。它提供了丰富的预训练模型、常用数据集、图像变换工具和计算机视觉组件,大大简化了视觉相关深度学习项目的开发流程。 我们可以在Pytorch的官网找到torchvision的文…

18、Python字符串全解析:Unicode支持、三种创建方式与长度计算实战

适合人群:零基础自学者 | 编程小白快速入门 阅读时长:约6分钟 文章目录 一、问题:Python的字符串是什么?1、例子1:多语言支持演示2、例子2:字符串不可变性验证3、答案:(1&#xff09…

5月27日复盘-Transformer介绍

5月27日复盘 二、层归一化 层归一化,Layer Normalization。 Layer Normalizatioh和Batch Normalization都是用来规范化中间特征分布,稳定和加速神经网络训练的,但它们在处理方式、应用场景和结构上有本质区别。 1. 核心区别 特征BatchNo…

MyBatis-Plus一站式增强组件MyBatis-Plus-kit(更新2.0版本):零Controller也能生成API?

MyBatis-Plus-Kit 🚀 MyBatis-Plus-Kit 是基于MyBatis-Plus的增强组件,专注于提升开发效率,支持零侵入、即插即用的能力扩展。它聚焦于 免写 Controller、代码一键生成、通用响应封装 等核心场景,让您只需专注业务建模&#xff0…

实时数仓flick+clickhouse启动命令

1、启动zookeeper zk.sh start 2、启动DFS,Hadoop集群 start-dfs.sh 3、启动yarn start-yarn.sh 4、启动kafka 启动Kafka集群 bin/kafka-server-start.sh -daemon config/server.properties 查看Kafka topic 列表 bin/kafka-topics.sh --bootstrap-server local…

【Git】Commit Hash vs Change-Id

文章目录 1、Commit 号2、Change-Id 号3、区别与联系4、实际场景示例5、为什么需要两者?6、总结附录——Gerrit 在 Git 和代码审查工具(如 Gerrit)中,Commit 号(Commit Hash) 和 Change-Id 号 是两个不同的…

【KWDB创作者计划】_KWDB分布式多模数据库智能交通应用——高并发时序处理与多模数据融合实践

导读:本文主要探讨了基于KWDB的分布式多模数据库智能交通应用场景,进行了高并发时序处理与多模数据融合实践方向的思考。探索智慧交通领域的数据实时处理与存储资源利用方面的建设思路。 本文目录 一、智能交通数据架构革命   1.1 传统架构瓶颈  …

Java集合框架与三层架构实战指南:从基础到企业级应用

一、集合框架深度解析 1. List集合的武林争霸 ArrayList: 数组结构:内存连续,查询效率O(1) 扩容机制:默认扩容1.5倍(源码示例) private void grow(int minCapacity) {int oldCapacity elementData.len…

6个月Python学习计划 Day 2 - 条件判断、用户输入、格式化输出

6个月Python学习计划:从入门到AI实战(前端开发者进阶指南) Python 基础入门 & 开发环境搭建 🎯 今日目标 学会使用 input() 获取用户输入掌握 if/else/elif 条件判断语法熟悉格式化输出方式:f-string、format() …

目标检测 TaskAlignedAssigner 原理

文章目录 TaskAlignedAssigner 原理和代码使用示例 TaskAlignedAssigner 原理和代码 原理主要是结合预测的分类分数和边界框与真实标注的信息,找出与真实目标最匹配的锚点,为这些锚点分配对应的目标标签、边界框和分数。 TaskAlignedAssigner 是目标检…

游戏:元梦之星游戏开发代码(谢苏)

《元梦之星》是一款轻松社交派对游戏,玩家们可以化身星宝,体验纯粹的游玩乐趣,收获简单的快乐。无论i人e人,都能轻松找到属于自己的社交方式。 《元梦之星》的快乐,可以是闯关夺冠时的激动,谁是狼人推理的巧妙,峡谷3V3打赢团战的爽感。也可以是星梦广场开…