高并发、高可用的消息队列(MQ)设计与实战
目录
- 背景与历史
- 消息队列的核心功能
- 高并发、高可用的业务场景
- 消息队列的实用性
- 企业规模与消息队列的选择
- Java实战案例:基于RabbitMQ的高并发、高可用消息队列
- 6.1 环境准备
- 6.2 RabbitMQ的安装与配置
- 6.3 Java客户端集成
- 6.4 生产者与消费者实现
- 6.5 高并发处理
- 6.6 高可用性设计
- 6.7 性能优化与监控
- 总结
1. 背景与历史
消息队列(Message Queue, MQ)是一种在分布式系统中用于解耦、异步通信的重要组件。它的历史可以追溯到早期的企业应用集成(EAI)时代,当时企业需要将多个异构系统进行集成,消息队列应运而生。随着互联网的发展,尤其是电商、社交网络、金融等领域的崛起,消息队列逐渐成为高并发、高可用系统的核心组件之一。
早期的消息队列系统如IBM MQ、TIBCO等,主要面向企业级应用,功能强大但复杂度较高。随着开源文化的兴起,RabbitMQ、Kafka、RocketMQ等开源消息队列系统逐渐成为主流,它们不仅功能强大,而且易于使用和扩展,逐渐成为互联网公司的首选。
在高并发、高可用的场景下,消息队列的作用尤为突出。它能够有效地缓解系统压力,提升系统的吞吐量和响应速度,同时通过异步处理、流量削峰等功能,保证系统的稳定性和可靠性。
2. 消息队列的核心功能
消息队列的核心功能可以总结为以下几点:
2.1 解耦
消息队列通过将消息的发送者和接收者解耦,使得系统各模块之间的依赖关系降低。发送者只需要将消息发送到队列中,而不需要关心谁来处理这些消息。接收者则从队列中获取消息并进行处理,而不需要知道消息的来源。
2.2 异步通信
消息队列支持异步通信,发送者将消息发送到队列后,可以立即返回,而不需要等待接收者处理完毕。这种方式可以显著提升系统的响应速度,尤其是在高并发场景下。
2.3 流量削峰
在高并发场景下,系统的瞬时流量可能会远远超过其处理能力。消息队列可以通过缓存消息的方式,将流量峰值削平,避免系统因瞬时压力过大而崩溃。
2.4 消息持久化
消息队列通常支持消息的持久化,即使系统崩溃或重启,消息也不会丢失。这对于金融、电商等对数据一致性要求较高的场景尤为重要。
2.5 消息顺序性
某些业务场景下,消息的处理顺序非常重要。消息队列可以通过队列的顺序性,保证消息按照发送的顺序被处理。
2.6 高可用性
现代消息队列系统通常支持集群部署,能够通过主从复制、分区等方式实现高可用性。即使某个节点出现故障,系统仍然可以继续运行。
3. 高并发、高可用的业务场景
消息队列在高并发、高可用的业务场景中有着广泛的应用,以下是一些典型的场景:
3.1 电商系统
在电商系统中,订单创建、库存扣减、支付处理等操作通常需要高并发处理。通过消息队列,可以将这些操作异步化,提升系统的吞吐量和响应速度。同时,消息队列还可以用于处理订单状态变更、物流信息更新等业务。
3.2 社交网络
社交网络中的消息推送、通知、点赞、评论等操作通常需要实时处理。通过消息队列,可以将这些操作异步化,避免因瞬时流量过大而导致系统崩溃。
3.3 金融系统
金融系统中的交易处理、对账、风控等操作对数据一致性和可靠性要求极高。通过消息队列,可以保证这些操作的顺序性和持久性,避免因系统故障而导致数据丢失。
3.4 日志处理
在大数据场景下,日志的收集、存储和分析通常需要高并发处理。通过消息队列,可以将日志异步化处理,提升系统的吞吐量和响应速度。
4. 消息队列的实用性
消息队列的实用性主要体现在以下几个方面:
4.1 提升系统性能
通过异步处理和流量削峰,消息队列可以显著提升系统的吞吐量和响应速度,尤其是在高并发场景下。
4.2 增强系统稳定性
消息队列通过解耦和异步通信,可以降低系统各模块之间的依赖关系,避免因某个模块的故障而导致整个系统崩溃。
4.3 保证数据一致性
通过消息持久化和顺序性,消息队列可以保证数据的一致性和可靠性,避免因系统故障而导致数据丢失。
4.4 支持系统扩展
消息队列通常支持集群部署和水平扩展,能够随着业务的发展而动态扩展,满足不断增长的业务需求。
5. 企业规模与消息队列的选择
不同规模的企业对消息队列的需求有所不同,以下是一些常见的消息队列系统及其适用场景:
5.1 RabbitMQ
RabbitMQ是一个开源的消息队列系统,支持多种消息协议(如AMQP、MQTT等),适用于中小型企业的业务场景。它的特点是易于使用、功能丰富,但在高并发场景下性能相对较弱。
5.2 Kafka
Kafka是一个分布式的消息队列系统,适用于大数据场景下的高并发、高吞吐量需求。它的特点是高性能、高可用性,但在消息顺序性和延迟方面相对较弱。
5.3 RocketMQ
RocketMQ是阿里巴巴开源的消息队列系统,适用于电商、金融等对数据一致性和顺序性要求较高的场景。它的特点是高性能、高可用性,支持事务消息和顺序消息。
5.4 ActiveMQ
ActiveMQ是一个开源的消息队列系统,支持多种消息协议(如JMS、AMQP等),适用于中小型企业的业务场景。它的特点是易于使用、功能丰富,但在高并发场景下性能相对较弱。
6. Java实战案例:基于RabbitMQ的高并发、高可用消息队列
6.1 环境准备
在开始实战之前,我们需要准备以下环境:
- JDK 1.8或以上版本
- Maven 3.x
- RabbitMQ 3.8.x
- IntelliJ IDEA或Eclipse IDE
6.2 RabbitMQ的安装与配置
首先,我们需要安装RabbitMQ。可以通过以下步骤在Linux系统上安装RabbitMQ:
# 安装Erlang
sudo apt-get install erlang# 安装RabbitMQ
sudo apt-get install rabbitmq-server# 启动RabbitMQ
sudo systemctl start rabbitmq-server# 启用RabbitMQ管理插件
sudo rabbitmq-plugins enable rabbitmq_management# 创建用户并设置权限
sudo rabbitmqctl add_user admin admin
sudo rabbitmqctl set_user_tags admin administrator
sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
安装完成后,可以通过http://localhost:15672
访问RabbitMQ的管理界面,使用admin/admin
登录。
6.3 Java客户端集成
接下来,我们需要在Java项目中集成RabbitMQ客户端。可以通过Maven添加以下依赖:
<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.12.0</version>
</dependency>
6.4 生产者与消费者实现
6.4.1 生产者实现
生产者负责将消息发送到RabbitMQ队列中。以下是一个简单的生产者实现:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Producer {private final static String QUEUE_NAME = "test_queue";public static void main(String[] args) throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setUsername("admin");factory.setPassword("admin");// 创建连接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());System.out.println(" [x] Sent '" + message + "'");}}
}
6.4.2 消费者实现
消费者负责从RabbitMQ队列中获取消息并进行处理。以下是一个简单的消费者实现:
import com.rabbitmq.client.*;public class Consumer {private final static String QUEUE_NAME = "test_queue";public static void main(String[] args) throws Exception {// 创建连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setUsername("admin");factory.setPassword("admin");// 创建连接Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 创建消费者DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + message + "'");};// 监听队列channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});}
}
6.5 高并发处理
在高并发场景下,我们需要对生产者和消费者进行优化,以提升系统的吞吐量和响应速度。
6.5.1 生产者并发优化
可以通过多线程的方式提升生产者的并发处理能力。以下是一个多线程生产者的实现:
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class ConcurrentProducer implements Runnable {private final static String QUEUE_NAME = "test_queue";private final String threadName;public ConcurrentProducer(String threadName) {this.threadName = threadName;}@Overridepublic void run() {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setUsername("admin");factory.setPassword("admin");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);for (int i = 0; i < 100; i++) {String message = threadName + " - Message " + i;channel.basicPublish("", QUEUE_NAME, null, message.getBytes());System.out.println(" [x] Sent '" + message + "'");}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {Thread t1 = new Thread(new ConcurrentProducer("Thread-1"));Thread t2 = new Thread(new ConcurrentProducer("Thread-2"));Thread t3 = new Thread(new ConcurrentProducer("Thread-3"));t1.start();t2.start();t3.start();}
}
6.5.2 消费者并发优化
可以通过增加消费者的数量来提升消息的处理能力。以下是一个多线程消费者的实现:
import com.rabbitmq.client.*;public class ConcurrentConsumer implements Runnable {private final static String QUEUE_NAME = "test_queue";private final String threadName;public ConcurrentConsumer(String threadName) {this.threadName = threadName;}@Overridepublic void run() {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setUsername("admin");factory.setPassword("admin");try {Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(threadName + " [x] Received '" + message + "'");};channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {Thread t1 = new Thread(new ConcurrentConsumer("Thread-1"));Thread t2 = new Thread(new ConcurrentConsumer("Thread-2"));Thread t3 = new Thread(new ConcurrentConsumer("Thread-3"));t1.start();t2.start();t3.start();}
}
6.6 高可用性设计
为了保证系统的高可用性,我们需要对RabbitMQ进行集群部署。以下是一个简单的RabbitMQ集群配置步骤:
6.6.1 集群配置
假设我们有三台服务器,分别为node1
、node2
和node3
。我们需要在这三台服务器上分别安装RabbitMQ,并将它们配置为一个集群。
在node1
上执行以下命令:
# 停止RabbitMQ
sudo systemctl stop rabbitmq-server# 重置RabbitMQ节点
sudo rabbitmqctl reset# 启动RabbitMQ
sudo systemctl start rabbitmq-server
在node2
和node3
上执行以下命令:
# 停止RabbitMQ
sudo systemctl stop rabbitmq-server# 重置RabbitMQ节点
sudo rabbitmqctl reset# 加入集群
sudo rabbitmqctl join_cluster rabbit@node1# 启动RabbitMQ
sudo systemctl start rabbitmq-server
6.6.2 镜像队列配置
为了保证队列的高可用性,我们需要配置镜像队列。可以通过以下命令在RabbitMQ中配置镜像队列:
sudo rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
6.7 性能优化与监控
在高并发、高可用的场景下,性能优化和监控是非常重要的。我们可以通过以下方式对RabbitMQ进行性能优化和监控:
6.7.1 性能优化
- 消息持久化:将消息设置为持久化,避免因系统崩溃而导致消息丢失。
- 批量确认:通过批量确认的方式提升消息的处理效率。
- 预取计数:通过设置预取计数(prefetch count)来控制消费者的消息处理速度。
6.7.2 监控
- RabbitMQ管理界面:通过RabbitMQ的管理界面,可以实时监控队列的状态、消息的吞吐量等。
- Prometheus + Grafana:通过Prometheus和Grafana,可以对RabbitMQ进行更深入的监控和可视化。
7. 总结
消息队列在高并发、高可用的系统中扮演着至关重要的角色。通过解耦、异步通信、流量削峰等功能,消息队列能够显著提升系统的性能和稳定性。本文从背景历史、核心功能、业务场景、实用性等方面对消息队列进行了详细介绍,并通过Java实战案例展示了如何基于RabbitMQ实现高并发、高可用的消息队列系统。
在实际应用中,企业需要根据自身的业务需求和规模选择合适的消息队列系统,并通过集群部署、性能优化、监控等手段,确保系统的高可用性和高性能。希望本文能够为读者在实际项目中应用消息队列提供有价值的参考。
相关文章:
高并发、高可用的消息队列(MQ)设计与实战
目录 背景与历史消息队列的核心功能高并发、高可用的业务场景消息队列的实用性企业规模与消息队列的选择Java实战案例:基于RabbitMQ的高并发、高可用消息队列 6.1 环境准备6.2 RabbitMQ的安装与配置6.3 Java客户端集成6.4 生产者与消费者实现6.5 高并发处理6.6 高可…...
nginx 新手指南
文章来源:https://nginx.cadn.net.cn/beginners_guide.html 本指南对 nginx 进行了基本的介绍,并描述了一些 可以用它完成的简单任务。 假设 nginx 已经安装在阅读器的机器上。 如果不是,请参阅 安装 nginx 页面。 本指南介绍如何启动和停止…...
7-4 西安距离
小明来到了古都西安,想去参观大唐西市! 西安的道路可以看做是与x轴或y轴垂直的直线,小明位于(a,b),而目的地位于(c,d),问最少几步可以到达。 输入格式: 一行中四个整数,a,b,c,d,表示坐标为(a…...
VScode+Latex (Recipe terminated with fatal error: spawn xelatex ENOENT)
使用VSCode编辑出现Recipe terminated with fatal error: spawn xelatex ENOENT问题咋办? 很好解决,大概率的原因是因为latex没有添加到系统环境变量中,所有设置的编译工具没有办法找到才出现的这种情况。 解决方法: winR 然后输…...
使用 Elastic Cloud Hosted 优化长期数据保留:确保政府合规性和效率
作者:来自 Elastic Jennie Davidowitz 在数字时代,州和地方政府越来越多地承担着管理大量数据的任务,同时确保遵守严格的监管要求。这些法规可能因司法管辖区而异,通常要求将数据保留较长时间 —— 有时从一年到七年不等。遵守刑事…...
51单片机 02 独立按键
一、独立按键控制LED亮灭 轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 #include <STC89C5xRC.H> void main() { // P20xFE;while(1){…...
海外问卷调查渠道查,具体运营的秘密
相信只要持之以恒并逐渐掌握技巧,每一位调查人在踏上征徐之时都会非常顺利的。并在日后的职业生涯中拥有捉刀厮杀的基本技能!本文会告诉你如何做好一个优秀的海外问卷调查人。 在市场经济高速发展的今天,众多的企业为了自身的生存和发展而在…...
Vue.js 的介绍与组件开发初步
Vue.js 的介绍与组件开发初步 Vue.js 的介绍与组件开发初步引言第一部分:Vue.js 基础入门1.1 什么是 Vue.js?1.2 搭建 Vue.js 开发环境安装 Node.js 和 npm安装 Vue CLI创建新项目运行示例 1.3 第一个 Vue.js 示例 第二部分:Vue.js 组件开发基…...
Shadow DOM举例
这东西具有隔离效果,对于一些插件需要append一些div倒是不错的选择 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"utf-8"> <title>演示例子</title> </head> <body> <style&g…...
kamailio-Core 说明书 版本:Kamailio SIP Server v6.0.x(稳定版)
Core 说明书 版本:Kamailio SIP Server v6.0.x(稳定版) 概述 本教程收集了 Kamailio 导出的函数和参数 core 添加到配置文件中。 注意:此页面上的参数不按字母顺序排列。 结构 kamailio.cfg 的结构可以看作是三个部分ÿ…...
PHP XML操作指南
PHP XML操作指南 引言 随着互联网的快速发展,数据交换和共享变得越来越重要。XML(可扩展标记语言)作为一种灵活的标记语言,被广泛应用于各种数据交换场景。PHP作为一种流行的服务器端脚本语言,具有强大的XML处理能力…...
一文了解DeepSeek
1. DeepSeek 的起源 创立时间:DeepSeek 于 2023 年由中国的梁文锋创立。 V3 模型训练成本:最终训练成本为 600 万美元。 开源:DeepSeek 提供开源版本。 流行度:DeepSeek R1 模型成为 Apple 应用商店中下载量最高的应用。 2. …...
三角形的最大周长(976)
976. 三角形的最大周长 - 力扣(LeetCode) 可以一起总结的题目:三数之和(15)-CSDN博客 官方解法: class Solution { public://官方解法int largestPerimeter(vector<int>& nums) {sort(nums.be…...
10:预处理
预处理 1、宏替换2、头文件包含3、条件编译4、typedef和#define的区别5、#define中的注意点5.1、使用do....while(0)5.2、#和##的含义 C语言编译器在编译程序之前,会先使用预处理器(预处理器)处理代码,代码经过预处理之后再送入编译器进行编译。预处理器…...
一文讲解HashMap线程安全相关问题(上)
HashMap不是线程安全的,主要有以下几个问题: ①、多线程下扩容会死循环。JDK1.7 中的 HashMap 使用的是头插法插入元素,在多线程的环境下,扩容的时候就有可能导致出现环形链表,造成死循环。 JDK 8 时已经修复了这个问…...
C++泛型编程指南04-(对默认调用参数的类型推断)
文章目录 问题描述解决方案示例代码 关键点解释进一步改进:结合概念约束 你提到的情况确实是一个常见的问题:在C中,类型推断不适用于默认调用参数。这意味着如果你希望函数模板能够通过默认参数来实例化,你需要为模板参数提供一个…...
Python爬虫:1药城店铺爬虫(完整代码)
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…...
浅谈知识蒸馏技术
最近爆火的DeepSeek 技术,将知识蒸馏技术运用推到我们面前。今天就简单介绍一下知识蒸馏技术并附上python示例代码。 知识蒸馏(Knowledge Distillation)是一种模型压缩技术,它的核心思想是将一个大型的、复杂的教师模型࿰…...
【人工智能】使用Python和Hugging Face构建情感分析应用:从模型训练到Web部署
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 情感分析是自然语言处理(NLP)中的重要任务,它通过分析文本来判断情绪或观点的倾向性。近年来,预训练语言模型如BERT、GPT等在情感分析任…...
【R语言】函数
一、函数格式 如下所示: hello:函数名;function:定义的R对象是函数而不是其它变量;():函数的输入参数,可以为空,也可以包含参数;{}:函数体,如果…...
python leetcode 笔记
只为记录一些python相关的特殊写法 无穷大,无穷小,NAN float(inf), float(-inf), float(nan) 判断字符的类型 isdigit(x) isspace(x) 字符串拼接 /.join([a,b,c]) # a/b/c 格式转换,字符转整形 ord(a) # 97 chr(97) # a 进制转…...
基于SpringBoot的青年公寓服务平台的设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
深入剖析 HTML5 新特性:语义化标签和表单控件完全指南
系列文章目录 01-从零开始学 HTML:构建网页的基本框架与技巧 02-HTML常见文本标签解析:从基础到进阶的全面指南 03-HTML从入门到精通:链接与图像标签全解析 04-HTML 列表标签全解析:无序与有序列表的深度应用 05-HTML表格标签全面…...
kamailio的kamctl的使用
kamctl 是 Kamailio SIP 服务器的管理工具,用于执行各种管理任务,如启动、停止、重启 Kamailio 进程,管理用户、ACL、路由、信任的 IP 地址等。以下是对 kamctl 命令的解释及举例说明: 1. 启动、停止、重启 Kamailio start: 启动…...
[创业之路-270]:《向流程设计要效率》-2-企业流程架构模式 POS架构(规划、业务运营、支撑)、OES架构(业务运营、使能、支撑)
目录 一、POS架构 二、OES架构 三、POS架构与OES架构的差异 四、各自的典型示例 POS架构典型示例 OES架构典型示例 示例分析 五、各自的典型企业 POS架构典型企业 OES架构典型企业 分析 六、各自典型的流程 POS架构的典型流程 OES架构的典型流程 企业流程架构模式…...
【leetcode100】路径总和Ⅲ
1、题目描述 给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点…...
用结构加法3ax+1预测第4点的分布
有1个点在19*19的平面上在某种力的作用下运动,轨迹为 共移动了90步,按照(0,1,2,3),(1,2,3,4),…,&…...
CTF-web: Python YAML反序列化利用
PyYAML存在以下几个特殊标签,如果这些标签被不安全的解析,会造成解析漏洞 从 PyYaml 版本 6.0 开始,load 的默认加载器已切换到 SafeLoader,以降低远程代码执行的风险。更新后易受攻击的是 yaml.unsafe_load 和 yaml.load(input, Loaderyaml.UnsafeLoade…...
JDK-1.8.0_432安装(CentOS7)
目录 1、卸载系统自带JDK 2、下载安装包并解压 3、赋予可执行权限 4、设置环境变量 5、刷新环境变量 6、查看JDK版本 1、卸载系统自带JDK # 查询出自带的jdk rpm -qa | grep jdk rpm -qa | grep java # 将上述命令列出的包依次删除 rpm -e --nodeps xxxxxxx 2、下载…...
OpenGL学习笔记(五):Textures 纹理
文章目录 纹理坐标纹理环绕方式纹理过滤——处理纹理分辨率低的情况多级渐远纹理Mipmap——处理纹理分辨率高的情况加载与创建纹理 ( <stb_image.h> )生成纹理应用纹理纹理单元练习1练习2练习3练习4 通过上一篇着色部分的学习,我们可以…...
【Pytorch和Keras】使用transformer库进行图像分类
目录 一、环境准备二、基于Pytorch的预训练模型1、准备数据集2、加载预训练模型3、 使用pytorch进行模型构建 三、基于keras的预训练模型四、模型测试五、参考 现在大多数的模型都会上传到huggface平台进行统一的管理,transformer库能关联到huggface中对应的模型&am…...
2025年Android开发趋势全景解读
文章目录 一、界面开发:从"手写代码"到"智能拼装"1.1 Jetpack Compose实战进化1.2 淘汰XML布局的三大信号 二、AI融合开发:无需炼丹的普惠智能2.1 设备端AI三大杀手级应用2.2 成本对比:设备端VS云端AI 三、跨平台演进&am…...
Python NumPy(12):NumPy 字节交换、NumPy 副本和视图、NumPy 矩阵库(Matrix)
1 NumPy 字节交换 在几乎所有的机器上,多字节对象都被存储为连续的字节序列。字节顺序,是跨越多字节的程序对象的存储规则。 大端模式:指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的…...
【Vaadin flow 实战】第5讲-使用常用UI组件绘制页面元素
vaadin flow官方提供的UI组件文档地址是 https://vaadin.com/docs/latest/components这里,我简单实战了官方提供的一些免费的UI组件,使用案例如下: Accordion 手风琴 Accordion 手风琴效果组件 Accordion 手风琴-测试案例代码 Slf4j PageT…...
第三篇:模型压缩与量化技术——DeepSeek如何在边缘侧突破“小而强”的算力困局
——从算法到芯片的全栈式优化实践 随着AI应用向移动终端与物联网设备渗透,模型轻量化成为行业核心挑战。DeepSeek通过自研的“算法-编译-硬件”协同优化体系,在保持模型性能的前提下,实现参数量与能耗的指数级压缩。本文从技术原理、工程实…...
搜索与图论复习2最短路
单源最短路---所有边权是正数(Dijkstra算法O(n^2)--稠密图(邻接矩阵)和堆优化的Dijkstra算法O(mlogn)--稀疏图(邻接表)) 或存在负边权(Bellman-ford贝尔曼福特算法O(nm)和SPFA一般O(m) 最坏O(nm) ) 多源最短路---Floyd算法O(n^3) 一、迪杰斯特拉算法(Dijkstra):1…...
redis集群理论详解
一. Redis集群发展历程 本片文章只介绍集群理论知识,不包含Redis集群搭建教程 教程文章请点击docker搭建redis集群(三主三从) 阶段一:单机版Redis 优点: 简单:易于部署和使用,适合小型项目或初期…...
本地缓存~
前言 Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中取而代之,基于LRU算法实现,支持多种缓存过期策略。 以下摘抄于https://github.com/ben-manes/caffeine/wiki/Benchmarks-zh-CN 基准测试通过使用Java microbenchmark ha…...
SpringBoot 整合 SpringMVC:SpringMVC的注解管理
分类: 中央转发器(DispatcherServlet)控制器视图解析器静态资源访问消息转化器格式化静态资源管理 中央转发器: 中央转发器被 SpringBoot 自动接管,不需要我们在 web.xml 中配置: <servlet><servlet-name>chapter2&l…...
YOLO11/ultralytics:环境搭建
前言 人工智能物体识别行业应该已经饱和了吧?或许现在并不是一个好的入行时候。 最近看到了各种各样相关的扩展应用,为了理解它,我不得不去尝试了解一下。 我选择了git里非常受欢迎的yolo系列,并尝试了最新版本YOLO11或者叫它ultr…...
扩散模型(三)
相关阅读: 扩散模型(一) 扩散模型(二) Latent Variable Space 潜在扩散模型(LDM;龙巴赫、布拉特曼等人,2022 年)在潜在空间而非像素空间中运行扩散过程,这…...
探索数学:从起源到未来的无尽旅程
数学的定义与本质 数学,这门古老而又充满魅力的学科,自人类文明诞生之初便如影随形。然而,要精准地定义数学并非易事,不同的学者从各自的视角出发,给出了多样的阐释。 亚里士多德将数学定义为 “数量科学”ÿ…...
OpenAI发布o3-mini:免费推理模型,DeepSeek引发的反思
引言 在人工智能领域,OpenAI再次引领潮流,推出了全新的推理模型系列——o3-mini。这一系列包括low、medium和high三个版本,旨在进一步推动低成本推理的发展。与此同时,OpenAI的CEO奥特曼也在Reddit的“有问必答”活动中罕见地公开…...
React中使用箭头函数定义事件处理程序
React中使用箭头函数定义事件处理程序 为什么使用箭头函数?1. 传递动态参数2. 避免闭包问题3. 确保每个方块的事件处理程序是独立的4. 代码可读性和维护性 示例代码总结 在React开发中,处理事件是一个常见的任务。特别是当我们需要传递动态参数时&#x…...
自制虚拟机(C/C++)(三、做成标准GUI Windows软件,扩展指令集,直接支持img软盘)
开源地址:VMwork 要使终端不弹出, #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") 还要实现jmp near 0x01类似的 本次的main.cpp #include <graphics.h> #include <conio.h> #include <windows.h> #includ…...
C# 语言基础全面解析
.NET学习资料 .NET学习资料 .NET学习资料 一、引言 C# 是一种功能强大、面向对象且类型安全的编程语言,由微软开发,广泛应用于各种类型的软件开发,从桌面应用、Web 应用到游戏开发等领域。本文将全面介绍 C# 语言的基础知识,帮…...
MySQL的覆盖索引
MySQL的覆盖索引 前言 当一个索引包含了查询所需的全部字段时,就可以提高查询效率,这样的索引又被称之为覆盖索引。 以MySQL常见的三种存储引擎为例:InnoDB、MyISAM、Memory,对于覆盖索引提高查询效率的方式均不同,…...
Hutool工具类
Hutool 是一个非常流行的 Java 工具类库,它提供了丰富的功能来简化开发中的常见任务,比如文件操作、加密、日期处理、字符串操作、数据库工具等。它是一个轻量级的工具库,可以减少开发者编写常用代码的工作量,提高开发效率。 主要…...
C++模板编程——可变参函数模板之折叠表达式
目录 1. 什么是折叠表达式 2. 一元左折 3. 一元右折 4. 二元左折 5. 二元右折 6. 后记 上一节主要讲解了可变参函数模板和参数包展开,这一节主要讲一下折叠表达式。 1. 什么是折叠表达式 折叠表达式是C17中引入的概念,引入折叠表达式的目的是为了…...
使用MATLAB进行雷达数据采集可视化
本文使用轮趣科技N10雷达,需要源码可在后台私信或者资源自取 1. 项目概述 本项目旨在通过 MATLAB 读取 N10 激光雷达 的数据,并进行 实时 3D 点云可视化。数据通过 串口 传输,并经过解析后转换为 三维坐标点,最终使用 pcplayer 进…...