消息队列(MQ)面试
目录
讲一讲MQ
面试官: 在你之前的项目中,你是否使用过消息队列(MQ)?能详细介绍一下你在项目中如何使用MQ吗?
在用户和用户之间的多对多聊天通信中如何使用,请具体来讲一下。
那你可以讲一下消息的确认机制、消息重发机制吗,如何保证不出现消息丢失或者乱序的情况
那你讲一下在项目中如何使用的这个消息的确认机制和消息重发机制,如何实现的。
使用的这个消息的确认机制和消息重发机制,把这个实现代码使用java语言在 springboot项目中写出来,用在用户和用户之间的通信上。
1.创建配置类(RabbitMQConfig.java):
2.创建发送消息的服务类:
3.创建消息接收的监听器:
讲一讲MQ
MQ是消息队列(Message Queue)的简称,它是一种异步通信机制,用于解耦和异步处理不同组件之间的通信。MQ通常由消息生产者、消息消费者和消息队列三部分组成。
消息生产者(Producer)负责产生消息并将其发送到消息队列中。消息可以是任何有效的数据,如文本、JSON、XML等格式。生产者向消息队列发送消息后,不需要等待消费者立即处理,而是可以继续执行其他任务。
消息队列(Message Queue)是一个存储消息的中间件,它承担了消息的存储和转发的功能。当消息发送到队列后,消费者可以从队列中取出消息进行处理。消息队列通常采用先进先出(FIFO)的方式来保证消息的顺序性。
消息消费者(Consumer)从消息队列中取出消息,并进行相应的处理。消费者可以根据自身的需求进行消息的订阅和筛选,只处理感兴趣的消息。消费者可以根据自身的处理能力和负载情况来选择并发地处理消息。
MQ具有以下优点:
-
解耦:生产者和消费者之间通过消息队列进行通信,彼此之间不直接依赖,解耦了系统各组件之间的耦合性。
-
异步处理:生产者发送消息后不需要等待消费者立即处理,可以继续执行其他任务,提高了系统的并发能力和吞吐量。
-
削峰填谷:当消息的产生速度大于消费速度时,消息队列可以缓存消息,并以合适的速率传递给消费者,避免了系统的压力过大。
-
可靠性保证:消息通常存储在持久化的存储介质中,如数据库或文件系统,以确保消息的可靠性,即使在系统故障或重启后仍能恢复。
-
扩展性:通过增加消息生产者和消费者的数量,可以很容易地扩展系统的处理能力。
常见的MQ产品有RabbitMQ、ActiveMQ、Kafka等,它们提供了丰富的功能和工具来管理消息队列,并提供了不同的特性来满足不同场景和需求。通过使用MQ,我们可以构建可靠、高性能的分布式系统,实现系统间的异步通信和解耦。
作为面试者,如果我在面试中被问到是否有使用过MQ,我可以回答以下几个方面来展示我的理解和经验:
-
了解MQ的概念和原理:首先,我可以简要解释MQ的概念和工作原理,包括消息的生产、存储和消费的过程。我可以强调MQ是一种解耦和异步通信的机制,可以提高系统的并发能力和可靠性。
-
基本的MQ使用方式:然后,我可以分享我在项目中使用MQ的经验。我可以提及我使用的MQ产品和版本,例如RabbitMQ、ActiveMQ或Kafka。我会提到我是如何配置和启动MQ实例的,如何定义和创建消息队列以及相关的交换机和绑定。我还可以提及如何写入消息到队列和从队列中读取消息,并且强调持久化的重要性来确保消息的可靠性。
-
MQ的应用场景:我可以介绍我在项目中使用MQ的具体应用场景。例如,我可以提到我是如何使用MQ来解耦系统中的不同模块,让它们能够独立开发、部署和扩展。我还可以提及我是如何使用MQ实现异步任务的处理,例如将耗时的操作放入消息队列中,再由消费者进行处理,以提高系统的性能和响应时间。
-
遇到的挑战和解决方案:在面试中,我可以分享我在使用MQ过程中遇到的挑战,并提及我是如何解决这些问题的。例如,如果我曾遇到过消息丢失的情况,我可以解释我是如何配置持久化机制来保证消息的可靠性;如果在高负载情况下系统出现瓶颈,我可以解释我是如何调整MQ的配置和扩展消费者的数量来解决性能问题。
总的来说,回答MQ的使用经验时,我应该展示自己对MQ的理解和熟悉程度,说明我曾在项目中使用过MQ,并能够描述我在使用过程中所遇到的具体情况、应用场景和解决方案。这样可以展示我在分布式系统和异步通信方面的技能和经验。
面试官: 在你之前的项目中,你是否使用过消息队列(MQ)?能详细介绍一下你在项目中如何使用MQ吗?
面试者: 是的,我在之前的项目中使用过消息队列,让我来详细介绍一下。
在我们项目中,我们使用了 RabbitMQ 这样的消息队列服务。MQ 在应用程序之间异步传递消息,解耦了各个系统的依赖,并提高了系统的可靠性、扩展性和性能。
我们的项目中主要有两个独立的模块,一个是订单模块,另一个是库存模块。在过去,当用户下单时,订单模块需要通知库存模块进行库存更新。为了解耦这两个模块的直接依赖关系,我们引入了 RabbitMQ 作为中间件。具体流程如下:
- 订单模块接收到用户下单请求后,将订单信息封装成消息,发送到 RabbitMQ 的交换机(Exchange)中。
- 在我们的架构中,有一个名为“库存处理器”的消费者服务,它订阅了订单交换机中的消息。
- 库存处理器收到消息后,开始处理这个订单。它会检查库存,并更新库存信息。
- 完成库存更新后,库存处理器向 RabbitMQ 发送一个确认消息,告诉 RabbitMQ 消息处理已经完成。
- RabbitMQ 收到确认消息后,将该消息从队列中删除。
这样,整个过程实现了订单模块和库存模块的解耦。即使库存模块发生故障或者不可用,订单模块依然能够正常接收和处理用户的下单请求。同时,由于消息是异步传递的,可以提高系统的响应速度和并发处理能力。
此外,我们还为消息队列的配置和管理搭建了一个独立的控制台。在控制台中,我们可以创建交换机、定义队列、绑定交换机和队列的关系,并进行监控和管理。
总结起来,我在项目中使用消息队列(MQ)的主要目的是将各个模块解耦,提高系统的可靠性、扩展性和性能。通过使用 RabbitMQ,我们成功实现了订单和库存的解耦,并提高了系统的并发处理能力。控制台的搭建让我们能够方便地配置和管理消息队列的各项功能。
在用户和用户之间的多对多聊天通信中如何使用,请具体来讲一下。
在用户和用户之间的多对多聊天通信中,可以使用消息队列(MQ)来实现消息的传递和分发。让我具体来讲一下。
-
首先,每个用户在登录时会被分配一个唯一的标识符(例如用户ID),用来在聊天系统中识别用户身份。
-
当一个用户发送一条消息时,消息将被封装成一个MQ消息,并发送到消息队列中。消息中包含发送者ID、接收者ID以及消息内容等信息。
-
在这个多对多的聊天场景中,除了发送者和接收者之外,可能还存在其他用户也可以接收到这条消息的情况(例如群聊)。
-
在消息队列中,可以设置不同的交换机和队列来管理消息的分发。可以为每个用户创建一个独立的队列,用来接收来自其他用户的消息。
-
当消息到达消息队列后,消息队列会根据消息的路由规则,将消息分发给对应的队列。这样就实现了消息的多点发送,即多个用户可以同时接收到同一条消息。
-
在每个用户的客户端中,需要监听自己对应的队列,以实时获取到其他用户发来的消息。一旦有新的消息到达,客户端将接收到该消息并进行相关处理,例如展示在聊天界面上。
通过使用消息队列实现多对多聊天通信,可以有效地解耦用户之间的直接依赖关系,并提高聊天系统的性能和可靠性。同时,通过合理地设计队列和交换机的关系,可以实现一对多、多对多等不同场景下的消息传递和分发。
需要注意的是,在这种场景下,由于消息是异步传递的,可能会出现消息丢失或者乱序的情况。因此,需要在系统设计时考虑一些额外的机制,如消息的确认机制、消息重发机制等,以确保消息的可靠性。
那你可以讲一下消息的确认机制、消息重发机制吗,如何保证不出现消息丢失或者乱序的情况
当涉及到消息的可靠性,消息的确认机制和消息重发机制是非常重要的。下面我将介绍这两个机制,以确保消息不会丢失或者乱序。
-
消息的确认机制(ACK机制):
在消息发送方发送消息后,接收方需要发送一个确认信号给发送方,告诉发送方消息已经被成功接收。只有当发送方收到了接收方的确认信号,才会认为消息被成功发送。如果发送方在一定时间内没有收到确认信号,就会认为消息发送失败,并进行相应的处理。在消息队列中,通常采用两种模式来实现消息的确认机制:消息自动确认和消息手动确认。
- 消息自动确认模式:消息一旦被投递到队列中,消息队列会立即发送确认信号给发送方,不需要接收方手动确认。
- 消息手动确认模式:接收方需要手动发送确认信号给发送方,告知消息已经被成功接收。在接收方处理消息之后,如果一切顺利,就发送一个确认信号。如果由于某种原因导致消息处理失败,可以选择不发送确认信号,消息会被重新发送。
通过消息的确认机制,可以确保消息被可靠地发送和接收,但仅仅使用确认机制还无法解决消息丢失或乱序的问题,这时候就需要使用消息重发机制。
-
消息的重发机制:
消息重发机制用于处理消息丢失或乱序的情况。当一个消息发送出去后,如果在一定的时间内没有收到接收方的确认信号,发送方会认为消息发送失败。这时,发送方可以选择将消息重新发送给接收方。可以使用以下两种方式来实现消息的重发机制:- 时间机制:在发送消息之前,发送方会设置一个超时时间。如果在超时时间内没有收到确认信号,发送方会重新发送该消息。
- 序列号机制:在消息中添加一个唯一的序列号。接收方在收到消息后,会先校验序列号,如果发现有序列号较小的消息还未收到,就会要求发送方重新发送该消息。
通过消息的重发机制,可以防止消息丢失或乱序的情况发生。在网络不稳定或者系统异常的情况下,通过设置合适的重发策略,可以提高消息的可靠性和稳定性。
需要注意的是,在实际应用中,消息的确认机制和消息重发机制往往是结合使用的,具体的实现方法可以根据具体的业务需求和系统特点来选择和定制。这样可以保证消息在多方传递中的可靠性,并最大程度地避免丢失或乱序的问题。
那你讲一下在项目中如何使用的这个消息的确认机制和消息重发机制,如何实现的。
在项目中使用消息的确认机制和消息的重发机制的具体实现方法可以基于具体的消息队列服务进行选择,我以RabbitMQ为例来进行说明。
在使用RabbitMQ进行消息队列的确认和重发时,可以采用以下方式实现:
-
消息的确认机制(ACK机制):
- 在项目中,可以使用RabbitMQ提供的手动确认模式(manual acknowledgement)来实现消息的确认机制。
- 当消息发送方发送消息后,消息接收方接收到消息并完成处理后,手动发送确认信号给RabbitMQ。在RabbitMQ收到确认信号后,会将该消息从队列中删除。
- 如果接收方在一定时间内没有发送确认信号,RabbitMQ会将未确认的消息重新投递给其他消费者,确保消息能够被可靠地处理。
-
消息的重发机制:
- 在RabbitMQ中,可以使用消息的持久化和TTL(Time-To-Live)来实现消息的重发机制。
- 在发送消息时,可以将消息设置为持久化,即将消息存储到磁盘中,以防止消息在服务重启或宕机后丢失。
- 同时,可以设置消息的有效期(TTL),即消息的存活时间,如果消息在一定时间内没有被消费者消费,RabbitMQ会将消息从队列中删除,并可以选择将消息发送到死信队列(DLQ)中进行进一步处理。
- 当消息未被确认时,RabbitMQ会根据消息的重发策略进行重发,可以设置重发次数和重发时间间隔。
需要根据项目的需求和复杂性进行相关配置,可以使用RabbitMQ提供的Management API或者RabbitMQ客户端库进行管理和监控。可以设置不同的消息队列、交换机和队列的配置参数,以满足项目对消息可靠性的要求。
总结起来,在项目中使用消息的确认机制和消息的重发机制,我们可以使用RabbitMQ的手动确认模式以及消息的持久化和TTL来实现。这样可以保证消息在多方传递时的可靠性,并避免消息丢失或乱序的问题。同时,可以根据具体业务需求进行相关的配置和监控,以确保消息队列的稳定性和可靠性。
使用的这个消息的确认机制和消息重发机制,把这个实现代码使用java语言在 springboot项目中写出来,用在用户和用户之间的通信上。
以下是一个使用Java和Spring Boot实现消息确认机制和消息重发机制的示例代码:
首先,确保你的Spring Boot项目中已经添加了RabbitMQ的依赖。
1.创建配置类(RabbitMQConfig.java):
@Configuration
@EnableRabbit
public class RabbitMQConfig {@Beanpublic ConnectionFactory connectionFactory() {CachingConnectionFactory connectionFactory = new CachingConnectionFactory();connectionFactory.setHost("localhost");connectionFactory.setPort(5672);connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");return connectionFactory;}@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {if (ack) {System.out.println("Message confirmed successfully");} else {System.out.println("Message failed to be confirmed: " + cause);}});return rabbitTemplate;}@Beanpublic SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);return factory;}
}
在上述配置类中,我们配置了连接工厂、RabbitTemplate以及消息监听器容器工厂。设置了手动确认模式,并且使用了回调函数来处理消息的确认结果。
2.创建发送消息的服务类:
@Service
public class MessageService {@Autowiredprivate RabbitTemplate rabbitTemplate;public void sendMessage(String message) {rabbitTemplate.convertAndSend("exchange_name", "routing_key", message);}
}
在该服务类中,我们使用RabbitTemplate来发送消息到指定的交换机和路由键。
3.创建消息接收的监听器:
@Component
public class MessageListener {@RabbitListener(queues = "chat_queue")public void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {try {System.out.println("Received message: " + message);// 处理消息// 手动发送确认信号channel.basicAck(tag, false);} catch (Exception e) {// 如果处理消息时发生异常,可以选择不发送确认信号,使消息重新进入队列channel.basicNack(tag, false, true);}}
}
在上述消息监听器中,我们通过@RabbitListener
注解指定监听的队列名称,当接收到消息时,会调用receiveMessage
方法进行处理。
通过以上代码,我们实现了在Spring Boot项目中使用消息确认机制和消息重发机制。
解释一下channel.basicNack(tag, false, true);
channel.basicNack(deliveryTag, multiple, requeue)
方法是用于消息的否定确认(negative acknowledgement)。
deliveryTag
:即交付标识(delivery tag),表示消息在 RabbitMQ 中的唯一标识。每条消息在发送时会被分配一个唯一的deliveryTag
。multiple
:指定是否批量处理。当设置为true
时,表示拒绝该deliveryTag
及之前的所有未确认消息;当设置为false
时,表示仅拒绝该deliveryTag
指定的消息。requeue
:指定被拒绝的消息是否重新入队列。当设置为true
时,消息会重新放回队列,等待重新分发;当设置为false
时,消息会被直接丢弃。
在代码中使用 channel.basicNack()
方法时,可以用它来拒绝(reject)一条或多条消息,可能是由于业务处理时发生异常或其他错误导致消息无法处理。
这里的 channel
是 com.rabbitmq.client.Channel
类型的对象,它表示一个 AMQP 通道,用于进行消息的收发操作。
示例代码中的 channel.basicNack(tag, false, true)
表示拒绝接收到的消息,并将该消息重新放入队列等待重新分发。tag
是消息的交付标识(delivery tag),false
表示仅拒绝当前的一条消息,true
表示消息会重新入队列。
需要注意的是,在使用 channel.basicNack()
方法时,必须将 RabbitMQ 的连接配置为支持 publisher confirms
,否则可能会引发 com.rabbitmq.client.UnexpectedFrameError
异常。
综上所述,channel.basicNack()
方法可以用于在消息处理发生异常或其他错误时,将消息拒绝并重新放入队列中进行重新分发,从而实现消息的重试或有效的错误处理。
相关文章:
消息队列(MQ)面试
目录 讲一讲MQ 面试官: 在你之前的项目中,你是否使用过消息队列(MQ)?能详细介绍一下你在项目中如何使用MQ吗? 在用户和用户之间的多对多聊天通信中如何使用,请具体来讲一下。 那你可以讲一下消息的确认…...
无涯教程-JavaScript - COUPNUM函数
描述 COUPNUM函数返回结算日和到期日之间应付的息票数量,四舍五入到最接近的整数。 语法 COUPNUM (settlement, maturity, frequency, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 Re…...
上海控安携汽车网络安全新研产品出席AUTOSEMO“恒以致远,共创共赢”主题研讨会
8月31日,AUTOSEMO“恒以致远,共创共赢”主题研讨会在天津成功召开。本次大会由中国汽车工业协会软件分会中国汽车基础软件生态标委会(简称:AUTOSEMO)与天津市西青区人民政府联合主办。现场汇聚了100余位来自产学研政企…...
小程序引入高德/百度地图坐标系详解
小程序引入高德/百度地图坐标系详解 官网最近更新时间:最后更新时间: 2021年08月17日 高德官网之在原生小程序中使用的常见问题 链接 目前在小程序中使用 高德地图只支持以下功能 :地址描述、POI和实时天气数据 小结:从高德api中获取数…...
英诺森 “供应链智能数据平台”荣获“科技进步奖”
近日,2023年中国物流与采购联合会科学技术奖正式公布,该奖项经国家科技部批准,在国家科学技术奖励工作办公室登记备案,是我国物流行业最具影响力的奖项之一。 英诺森联合客户申报的科技项目“英诺森供应链智能数据平台”…...
kafka 3.5 主题分区的Follower创建Fetcher线程从Leader拉取数据源码
Kakfa集群有主题,每一个主题下又有很多分区,为了保证防止丢失数据,在分区下分Leader副本和Follower副本,而kafka的某个分区的Leader和Follower数据如何同步呢?下面就是讲解的这个 首先要知道,Follower的数据…...
Golang web 项目中实现自定义 recovery 中间件
为什么需要实现自定义 recovery 中间件? 在 Golang 的 Web 项目中,自定义 recovery 中间件是一种常见的做法,用于捕获并处理应用程序的运行时错误,以避免整个应用程序崩溃并返回对应格式的响应数据。 很多三方 web 框架…...
Direct3D绘制旋转立方体例程
初始化文件见Direct3D的初始化_direct3dcreate9_寂寂寂寂寂蝶丶的博客-CSDN博客 D3DPractice.cpp #include <windows.h> #include "d3dUtility.h" #include <d3dx9math.h>IDirect3DDevice9* Device NULL; IDirect3DVertexBuffer9* VB NULL; IDirect3…...
ElementUI浅尝辄止31:Tabs 标签页
选项卡组件:分隔内容上有关联但属于不同类别的数据集合。 常见于网站内容信息分类或app内容信息tab分类 1.如何使用? Tabs 组件提供了选项卡功能,默认选中第一个标签页,你也可以通过 value 属性来指定当前选中的标签页。 <temp…...
将 ChatGPT 用于数据科学项目的指南
推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 我们都知道 ChatGPT 的受欢迎程度以及人们如何使用它来提高生产力。但是,如果您是新手,则值得注册ChatGPT免费演示并尝试它所能做的一切。您还应该参加我们的 ChatGPT 简介课程,学习…...
06-JVM对象内存回收机制深度剖析
上一篇:05-JVM内存分配机制深度剖析 堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的对象)。 1.引用计数法 给对象中添加一个引用计数器,每当有一个地方引…...
[VSCode] 替换掉/去掉空行
VSCode中使用快捷键CtrlH,出现替换功能,在上面的“查找”框中输入正则表达式: ^\s*(?\r?$)\n然后选择右侧的“使用正则表达式”;“替换”框内为空,点击右侧的“全部替换”,即可去除所有空行。 参考 [VS…...
时序分解 | MATLAB实现ICEEMDAN+SE改进的自适应经验模态分解+样本熵重构分量
时序分解 | MATLAB实现ICEEMDANSE改进的自适应经验模态分解样本熵重构分量 目录 时序分解 | MATLAB实现ICEEMDANSE改进的自适应经验模态分解样本熵重构分量效果一览基本介绍程序设计参考资料 效果一览 基本介绍 ICEEMDANSE改进的自适应经验模态分解样本熵重构分量 包括频谱图 避…...
python内网环境安装第三方包【内网搭建开发环境】
文章目录 一、问题二、解决方法三、代码实现一、问题 内网安装第三方包的应用场景,一般是一些需要在没网的环境下进行开发的情况。这些环境一般仅支持本地局域网访问,所以只能在不下载任何第三方包的情况下艰难开发。 二、解决方法 将当前应用依赖的第三方包提前下载到本地…...
7.13 在SpringBoot中 正确使用Validation实现参数效验
文章目录 前言引入Maven依赖一、POST/PUT RequestBody参数校验1.1 Valid或Validated注解配合constraints注解1.2 测试运行 二、GET/DELETE RequestParam参数校验2.1 Validated注解配合constraints注解2.2 测试运行 三、GET 无注解参数校验3.1 Valid或Validated注解配合constrai…...
Matlab图像处理之Lee滤波器
目录 一、前言:二、LEE滤波器2.1 LEE滤波器原理2.2 LEE滤波器实现步骤三、MATLAB代码示例一、前言: LEE滤波器是一种常用于合成孔径雷达(SAR)图像去噪的滤波器。它能增强图像的局部对比度。今天我们将通过MATLAB来实现这种滤波器。 二、LEE滤波器 2.1 LEE滤波器原理 LEE滤…...
C++系列-const修饰的常函数
const修饰的常函数 常函数常对象 常函数 成员函数后加const,称为常函数。常函数内部不可以修改成员变量。常函数内可以改变加了mutable修饰的成员变量。 code:#include <iostream>using namespace std;class Horse{public:int age 3;mutable string color …...
fail-safe 机制与 fail-fast 机制
Fail-fast 表示快速失败,在集合遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出 ConcurrentModificationException 异常,从而导致遍历失败,像这种情况 定义一个 Map 集合,使用 Iterator 迭代器进行数据…...
LLM 位置编码及外推
RoPE https://zhuanlan.zhihu.com/p/629681325 PI 位置插值(POSITION INTERPOLATION)显著改善RoPE的外推能力。你只需要对PT(pretraining)模型fine-turing最多1000步就能实现。PI是通过将线性的缩小了输入位置的索引使其匹配原始上下文窗口…...
第3章_瑞萨MCU零基础入门系列教程之开发环境搭建与体验
本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…...
AI在医疗保健领域:突破界限,救治生命
文章目录 AI在医学影像分析中的应用AI在疾病预测和早期诊断中的作用个性化治疗和药物研发医疗数据管理和隐私保护未来展望 🎉欢迎来到AIGC人工智能专栏~AI在医疗保健领域:突破界限,救治生命 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博…...
centos7安装kubernets集群
一、准备工作 准备三台虚拟机,centos7系统 二、系统配置 1. 修改主机名 # 三台机器都需要执行 hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-node1 hostnamectl set-hostname k8s-node22. 修改hosts文件 # 三台机器都需要执行 [rootk8s-…...
【多线程】线程安全与线程同步
线程安全与线程同步 1.什么是线程安全问题? 多个线程同时操作同一个共享资源的时候,可能会出现业务安全问题 取钱的线程安全问题场景: 两个人他们有一个共同的账户,余额是10万元,如果两个人同时来取钱,…...
指针权限,new与delete,类与对象,函数模板,类模板的用法
指针权限 用法 void Print(const char* SecretPointer) {cout << "绝密指令为:";cout << SecretPointer << endl; }void Change(int& number, int* const FixedPointer) {cout << "更换站台数字为:";c…...
Unity——脚本与序列化
在介绍序列化之前,我们先来了解一下为什么要对数据进行序列化 数据序列化有以下几个主要的应用场景和目的: 1. 持久化存储:序列化可以将对象或数据结构转换为字节序列,使得其可以被存储在磁盘上或数据库中。通过序列化ÿ…...
NJ求职盘点
电子显示 集成电路 地平线 后摩智能 芯启源 自动驾驶 地平线 栖霞区兴智科技园 泊车、SLAM/3D算法工程师 https://wecruit.hotjob.cn/SU64819a4f2f9d2433ba8b043a/pb/social.html?currentPage1 后摩智能 栖霞区兴智科技园 视觉感知算法资深工程师 可以做自动驾驶前瞻性…...
01卡特兰数
卡特兰数跟排列组合很有关系,所以在看此文章前请掌握: 加法原理乘法原理A(m,n)计算公式及其原理C(m,n)计算公式及其原理 前言 今天您将会学习到基本的卡特兰数及其应用。 一、卡特兰数是什么? 卡特兰数(Catalan number࿰…...
若依前端vue设置子路径
若依前端vue设置子路径 说明:本文档中以前后端分离版为例,版本为:3.8.6 一设置变量 在.env.development和.env.production 中定义一个变量如VUE_APP_PROJECT_IDENTIFIER # 项目标识字符 VUE_APP_PROJECT_IDENTIFIER admin二引用路径变量 ${process…...
Vue中使用pdf.js实现在线预览pdf文件流
以下是在Vue中使用pdf.js实现在线预览pdf文件流的步骤: 1. 安装pdf.js npm install pdfjs-dist2. 引入pdf.js 在需要使用的组件中,使用以下代码引入pdf.js: import pdfjsLib from pdfjs-dist3. 加载pdf文件流 使用pdf.js的getDocument()方…...
态、势、感、知与时空、关系
态势感知是一种通过收集、整合、分析和解释大量的时空数据,以获取关于特定领域、地区或事件的全面理解的过程。时空和关系在态势感知中扮演着非常重要的角色。 态:态指的是物体或系统所处的状态或状况。在不同的态下,物体或系统的性质、行为和…...
最优网络做网站/浙江seo技术培训
1)对于浏览器的刷新而言,当浏览器缓存中有资源,也会找服务端要资源,只有在回车访问情况下,才找缓存 2)可以通过重写getLastModified()方法来阻止每次刷新都访问服务端,以减轻服务端的压力 代码含义 public class De…...
如何在网站上做网盘/企业网站优化软件
2022年已经开始了,在新的一年里,又要大干一场了。工欲善其事必先利其器,计划做完之后,总要有能记录待办事项以及任务清单的应用,可以记录自己要做的事情,方便自己及时查看自己有哪些事情没有做,…...
武汉建设局网站/企业官网
/*** 该示例展示了创建不同样式的 GeoODLine*/ var app new THING.App(); app.background [0, 0, 0]THING.Utils.dynamicLoad(https://www.thingjs.com/uearth/uearth.min.js, function () {// 创建一个地图var map app.create({type: Map,attribution: Google,style: {nigh…...
咋做黄页网站/精准推广
...
游戏推广怎么快速拉人/电池优化大师下载
cut命令用于文本处理。通过选择列,可以使用此命令从文件中提取文本的一部分 cut命令的选项 Cut基本语法: cut OPTION... [FILE]...选项: -f : 通过指定哪一个字段进行提取。cut命令使用“TAB”作为默认的字段分隔符。 -d : “TAB”是默认…...
不花钱的网站怎么做/济南网站建设哪家好
点击率:每秒钟客户端向服务器端发起的http请求个数(不是片面的指鼠标点击次数,例如,点击一个按钮服务器返回一个页面且包含3个图片,那么向服务器发送的请求数为4) 吞吐量:累计时间内的全部数据量…...