当前位置: 首页 > news >正文

SpringBoot与Minio的极速之旅:解锁文件切片上传新境界

目录

一、前言

二、对象存储(Object Storage)介绍

(1)对象存储的特点

(2)Minio 与对象存储

(3)对象存储其他存储方式的区别

(4)对象存储的应用场景

三、Minio基础介绍

(1)主要特性

(2)应用场景

(3)架构和部署

四、SringBoot集成MinIO实现切片上传

1. 引入依赖

2.配置MinIO相关配置信息

3. 配置 MinIO 客户端

4. 创建文件切片上传服务

5. 创建文件切片上传控制器

6.测试及说明


一、前言

在数字化时代,文件上传是众多应用不可或缺的一环。随着文件体积的增大和用户对上传速度的追求,传统的上传方式已难以满足需求。SpringBoot作为Java开发者的利器,结合Minio这一高性能对象存储解决方案,为我们提供了一种全新的文件上传体验——文件切片极速上传。

本文将带领读者深入探索SpringBoot与Minio的结合,通过文件切片技术,实现高效、稳定的文件上传。我们将从基础概念出发,逐步介绍这个文件切片上传系统,解锁上传速度的新境界。希望对正在研究文件存储的小伙伴们有所启发~

二、对象存储(Object Storage)介绍

首先简单介绍一下对象存储的相关概念~~~

对象存储是一种数据存储架构,它将数据作为对象进行管理,而不是传统的文件系统或块存储方式。每个对象通常包含数据本身、元数据和唯一标识符。对象存储适用于大规模数据存储和高并发访问场景,具有高扩展性、高可靠性和低成本的特点。

(1)对象存储的特点

  1. 高扩展性

    • 对象存储系统可以轻松扩展存储容量,通过增加存储节点来满足不断增长的数据需求。

  2. 高可靠性

    • 对象存储系统通常采用数据冗余和分布式存储技术,确保数据的高可用性和可靠性。即使部分节点故障,数据也不会丢失。

  3. 低成本

    • 对象存储采用廉价的存储介质(如硬盘),并通过数据压缩和去重技术减少存储空间的占用,从而降低存储成本。

  4. 丰富的元数据

    • 每个对象都包含丰富的元数据,可以用于描述数据的属性、访问权限等信息,方便数据的检索和管理。

  5. RESTful API

    • 对象存储系统通常提供 RESTful API,方便开发者通过 HTTP 协议进行数据的上传、下载和管理。

(2)Minio 与对象存储

Minio 是一个典型的对象存储解决方案,它完全兼容 Amazon S3 API,提供了以下对象存储的核心功能:

  1. 对象管理

    • Minio 将数据作为对象进行管理,每个对象包含数据本身、元数据和唯一标识符。用户可以通过 S3 API 进行对象的创建、读取、更新和删除操作。

  2. 存储桶(Bucket)

    • 存储桶是对象的容器,类似于文件系统中的目录。用户可以在 Minio 中创建和管理多个存储桶,每个存储桶可以包含多个对象。

  3. 访问控制

    • Minio 支持基于存储桶和对象的访问控制,用户可以通过策略(Policy)和访问控制列表(ACL)来管理数据的访问权限。

  4. 数据冗余

    • Minio 支持分布式部署,通过数据冗余技术确保数据的高可用性和可靠性。分布式 Minio 可以自动处理数据复制和故障恢复。

  5. 数据加密

    • Minio 支持数据加密,包括服务器端加密和客户端加密,确保数据在传输和存储过程中的安全性。

  6. RESTful API

    • Minio 提供 RESTful API,方便开发者通过 HTTP 协议进行数据的管理和访问。

(3)对象存储其他存储方式的区别

对象存储(Object Storage)和普通存储(包括文件存储和块存储)是三种不同的数据存储架构,它们在数据管理方式、扩展性、性能和应用场景等方面存在显著差异。

存储方式数据管理方式扩展性性能应用场景优点缺点
对象存储数据作为对象进行管理,每个对象包含数据本身、元数据和唯一标识符。对象存储通常提供 RESTful API 进行数据访问和管理。具有极高的扩展性,可以通过增加存储节点来扩展存储容量和提高性能。适用于大规模数据访问和高并发场景,具有较高的吞吐量和较低的延迟。适用于大规模数据存储和高并发访问场景,如静态网站托管、大数据处理、备份和归档、云原生应用等。

高扩展性:可以轻松扩展存储容量和性能;

高可靠性:通过数据冗余和分布式存储确保数据的高可用性和可靠性;

低成本:采用廉价的存储介质,并通过数据压缩和去重技术降低存储成本;

丰富的元数据:每个对象包含丰富的元数据,方便数据的检索和管理;

RESTful API:提供 RESTful API,方便开发者进行数据访问和管理。

延迟较高:相对于块存储,对象存储的延迟较高,不适用于对延迟要求极高的应用场景。

复杂性:对象存储的架构和管理相对复杂,需要专业的技术团队进行维护。

文件存储数据作为文件和目录层次结构进行管理,类似于传统的文件系统。文件存储通常提供文件路径进行数据访问。扩展性有限,通常受限于单个服务器的存储容量和性能。适用于中小规模数据访问,性能受限于单个服务器的处理能力。适用于文件共享和协作场景,如企业文件服务器、网络附加存储(NAS)等。

简单易用:文件存储的架构和管理相对简单,易于使用和维护。

兼容性:兼容传统的文件系统操作,方便用户进行数据访问和管理。

扩展性有限:受限于单个服务器的存储容量和性能,难以扩展。

性能有限:性能受限于单个服务器的处理能力,不适用于高并发和大规模数据访问场景。

块存储数据作为固定大小的块进行管理,每个块具有唯一的标识符。块存储通常作为虚拟机的存储卷使用,提供低延迟的数据访问。扩展性一般,通常通过增加存储设备或扩展存储区域网络(SAN)来提高存储容量。提供低延迟的数据访问,适用于对性能要求较高的应用场景,如数据库和虚拟机。适用于对性能要求较高的应用场景,如数据库、虚拟化环境、高性能计算等。

低延迟:提供低延迟的数据访问,适用于对性能要求较高的应用场景。

高性能:适用于数据库、虚拟化环境等高性能计算场景。

扩展性有限:通常通过增加存储设备或扩展存储区域网络(SAN)来提高存储容量,扩展性有限。

成本较高:相对于对象存储,块存储的成本较高,特别是在大规模存储场景下。

(4)对象存储的应用场景

对象存储适用于多种应用场景,包括但不限于:

  • 静态网站托管:对象存储可以作为静态网站的存储和分发平台,提供高速的内容传输。

  • 大数据处理:对象存储可以作为大数据处理框架(如 Hadoop、Spark)的存储后端,提供高效的数据访问。

  • 备份和归档:对象存储可以用于企业数据的备份和归档,确保数据的安全性和可恢复性。

  • 云原生应用:对象存储与 Kubernetes 等容器编排平台无缝集成,适用于云原生应用的存储需求。

三、Minio基础介绍

Minio 是一个开源的高性能对象存储解决方案,专为云原生应用设计。它兼容 Amazon S3 API,提供了简单、可靠的存储服务,适用于各种规模的应用场景。Minio 的设计理念是轻量级和高性能,使其成为容器化和微服务架构中的理想选择。

(1)主要特性

  1. 兼容 S3 API

    • Minio 完全兼容 Amazon S3 API,这意味着开发者可以使用现有的 S3 客户端和工具与 Minio 进行交互,无需修改代码。

  2. 分布式存储

    • Minio 支持分布式部署,可以通过扩展节点来增加存储容量和提高性能。分布式 Minio 可以自动处理数据冗余和故障恢复,确保数据的高可用性和可靠性。

  3. 高性能

    • Minio 采用 Go 语言编写,具有出色的性能和低延迟。它能够处理大规模的数据传输,适用于高并发场景。

  4. 数据安全

    • Minio 支持数据加密(包括服务器端加密和客户端加密),确保数据在传输和存储过程中的安全性。

  5. 简单易用

    • Minio 的安装和配置非常简单,支持多种操作系统和平台。它还提供了丰富的管理工具和 API,方便开发者进行管理和监控。

  6. 开源免费

    • Minio 是开源项目,采用 Apache License 2.0 许可,用户可以免费使用并对其进行二次开发。

(2)应用场景

Minio 适用于多种应用场景,包括但不限于:

  • 静态网站托管:Minio 可以作为静态网站的存储和分发平台,提供高速的内容传输。

  • 大数据处理:Minio 可以作为大数据处理框架(如 Hadoop、Spark)的存储后端,提供高效的数据访问。

  • 备份和归档:Minio 可以用于企业数据的备份和归档,确保数据的安全性和可恢复性。

  • 云原生应用:Minio 与 Kubernetes 等容器编排平台无缝集成,适用于云原生应用的存储需求。

(3)架构和部署

Minio 支持单节点和分布式部署两种模式:

  • 单节点部署:适用于小规模应用和开发测试环境。单节点 Minio 部署简单,易于管理。

  • 分布式部署:适用于大规模应用和高可用性需求。分布式 Minio 通过多个节点组成存储集群,提供更高的性能和可靠性。

Minio 的部署可以通过 Docker 容器、Kubernetes 集群或直接在物理服务器上进行。它还提供了丰富的命令行工具和 Web 管理界面,方便用户进行配置和管理。这里主要介绍SpringBoot与minio的集成,因此这块笔者就不单独说明部署的详细方式了,仅采用容器化单实例服务进行。

#自定义账号密码运行容器
[root@node01 ~]# docker run -d \
> -p 9000:9000 \
> -p 9001:9001 \
> --name minio \
> -v /data/minio/data:/data \
> -e "MINIO_ROOT_USER=admin" \
> -e "MINIO_ROOT_PASSWORD=admin123" \
> swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/minio/minio:RELEASE.2024-06-13T22-53-53Z server /data --console-address ":9001"
Unable to find image 'swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/minio/minio:RELEASE.2024-06-13T22-53-53Z' locally
RELEASE.2024-06-13T22-53-53Z: Pulling from ddn-k8s/docker.io/minio/minio
d95a8f5a9b46: Pull complete 
392be19a63f6: Pull complete 
86f90f8ca150: Pull complete 
7dc3c1e5f08a: Pull complete 
1ab6ab2ba6f0: Pull complete 
6fac698163eb: Pull complete 
6a4e2f681031: Pull complete 
53a5b322abdc: Pull complete 
Digest: sha256:98fe67c08bf95945b34f8e74622976495e6c47b3e8dd2faed079ac2804b98c97
Status: Downloaded newer image for swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/minio/minio:RELEASE.2024-06-13T22-53-53Z

四、SringBoot集成MinIO实现切片上传

1. 引入依赖

首先,在你的 pom.xml 文件中引入必要的依赖,包括 minio 和其他相关依赖:

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.7</version>
</dependency>
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.5</version>
</dependency>
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version>
</dependency>

2.配置MinIO相关配置信息

首先需要在MinIO服务页面配置一个令牌桶(Bucket),MinIO使用bucket来组织对象。bucket类似于文件系统中的文件夹或目录,其中每个bucket可以容纳任意数量的对象。这里咱们创建一个名为test的bucket。

  • versioning(版本控制):允许在同一键下保持同一对象的多个版本。

  • Object Locking(对象锁定):防止对象被删除。需要支持保留和合法持有。只能在创建桶时启用。

  • Quota(配额):限制bucket中的数据量。

  • Retention(存放):开启会施加规则,在一段时间内防止对象删除。为了设置桶保留策略,必须启用版本控制。

然后需要创建API的访问凭证,这个用于minio在springboot配置文件中使用时的配置。

完成后保留好access key和secret key信息。接下来可以在springboot的yml配置文件中配置minio的相关信息了:

server:port: 8919
spring:servlet:multipart:enabled: truemax-file-size: 2048MBmax-request-size: 2048MBconfig:file-server:#文件服务,local/minio,local本地文件服务,minio minio服务type: miniolocal:secret: e9eaa184ac1b4068829edb4f3ea978f4# 防盗链st有效时长(秒)st-effective-time: 300file-dir: D:/springboot-test/uploadFilepreview-url: http://127.0.0.1:8918minio:access-key: ZTsent9wl6UlKBGiNoaDsecret-key: b1CXhMIovbevJ2q9LQuPR4lhaFNCqSlX2o5EgQtWurl: http://192.168.1.201:9000bucket-name: test
  • access-keysecret-key是访问minio服务的凭证,就是上面刚创建的。

  • url是minio服务的地址,这里要区分web端的访问地址9001,默认9000是mino的服务地址。

  • bucket-name是存储文件的桶名,这个咱们生成的名称是test。

3. 配置 MinIO 客户端

在你的 SpringBoot 应用中配置 MinIO 客户端。可以通过创建一个配置类来实现:

package com.yy.fs.config;
​
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
​
/*** Minio 配置** @author young* @date 2024/09/03*/
@Configuration
@Data
@ConfigurationProperties("config.file-server.minio")
public class MinioConfig {private String accessKey;private String secretKey;private String url;private String bucketName;
​@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();}
}

4. 创建文件切片上传服务

创建一个服务类来处理文件切片上传的逻辑:

package com.yy.fs.mytest;
​
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.errors.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
​
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Objects;
​
@Service
public class FileUploadService {
​private static final Logger LOGGER = LoggerFactory.getLogger(FileUploadService.class);@Autowiredprivate MinioClient minioClient;
​/** uploadChunk 用于上传文件块,参数包括桶名、对象名和文件块。*/public void uploadChunk(String bucketName, String objectName,  MultipartFile chunkFile) throws IOException, ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {// 检查指定的桶是否存在,如果不存在则创建一个新的桶。boolean isExist =minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if (!isExist) {// Make a new bucket called bucket.minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());} else {LOGGER.info("Bucket " + bucketName + " already exists.");}byte[] bytes = chunkFile.getBytes();ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
​String suffix = objectName.contains(".") ? objectName.substring(objectName.lastIndexOf(".")):"";// 使用MinIO客户端上传文件块到指定的桶和对象名minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName.substring(0,objectName.lastIndexOf(".")) + "_chunk"  + suffix).stream(byteArrayInputStream, byteArrayInputStream.available(), -1).build());}
}

5. 创建文件切片上传控制器

创建一个控制器来处理文件切片上传的请求,在实际项目中根据前端的参数传入即可:

package com.yy.fs.mytest;
​
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
​
@RestController
public class FileUploadController {
​@Autowiredprivate FileUploadService fileUploadService;
​@PostMapping("/uploadChunk")public String uploadChunk(@RequestParam("bucketName") String bucketName,@RequestParam("objectName") String objectName,@RequestParam("chunkFile") MultipartFile chunkFile) {try {fileUploadService.uploadChunk(bucketName, objectName,  chunkFile);return "Chunk  uploaded successfully";} catch (Exception e) {e.printStackTrace();return "Failed to upload chunk ";}}
}

6.测试及说明

最后使用测试工具测试一下,这里咱们上传一个视频文件进行测试:

上传成功后可以在MinIO界面查看到已上传的视频信息:

并且支持下载,预览与分享,基本算一个文件存储系统类似的玩意。但是实际在服务存储的目录下就不同了:

data目录下随着我们创建一个test的桶而生成了一个test文件,当文件通过后端接口传入minio后根据文件大小自动被切片为了很多小文件,这也难怪他的文件上传速度要比直接上传整个文件高效多了。更主要的是可以省略去构建切片方法实现切片逻辑的步骤,让minio自己完成。感兴趣的小伙伴可参考下方链接继续研究一下~

参考地址:MinIO中文文档

相关文章:

SpringBoot与Minio的极速之旅:解锁文件切片上传新境界

目录 一、前言 二、对象存储&#xff08;Object Storage&#xff09;介绍 &#xff08;1&#xff09;对象存储的特点 &#xff08;2&#xff09;Minio 与对象存储 &#xff08;3&#xff09;对象存储其他存储方式的区别 &#xff08;4&#xff09;对象存储的应用场景 三、…...

Java 7.3 - 分布式 id

分布式 ID 介绍 什么是 ID&#xff1f; ID 就是 数据的唯一标识。 什么是分布式 ID&#xff1f; 分布式 ID 是 分布式系统中的 ID&#xff0c;它不存在于现实生活&#xff0c;只存在于分布式系统中。 分库分表&#xff1a; 一个项目&#xff0c;在上线初期使用的是单机 My…...

144. 腾讯云Redis数据库

文章目录 一、Redis 的主要功能特性二、Redis 的典型应用场景三、Redis 的演进过程四、Redis 的架构设计五、Redis 的数据类型及操作命令六、腾讯云数据库 Redis七、总结 Redis 是一种由 C 语言开发的 NoSQL 数据库&#xff0c;以其高性能的键值对存储和多种应用场景而闻名。本…...

基于单片机的自动浇花控制写设计任务书

一、内容要求&#xff1a; 任务 随着社会的进步&#xff0c;人们的生活质量越来越高。在家里养养盆花可以陶冶情操&#xff0c;丰富生活。同时盆花可以通过光合作用吸收二氧化碳&#xff0c;净化室内空气&#xff0c;在有花木的地方空气中阴离子聚集较多&#xff0c;所以空气…...

从零到精通:用C++ STL string优化代码

目录 1:为什么要学习string类 2:标准库中的string类 2.1:string类(了解) 2.2:总结 3:string类的常用接口 3.1:string类对象的常见构造 3.1.1:代码1 3.1.2:代码2 3.2:string类对象的遍历操作 3.2.1:代码1(begin end) 3.2.2:代码2(rbegin rend) 3.3:string类对象的…...

鸿蒙轻内核M核源码分析系列五 时间管理

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 持续更新中…… 在鸿蒙轻内核源码分析上一篇文章中&#xff0c;我们剖析了中断的源码&#xff0c;简单提到了Tick中断。本文会继续分析Tick和时间相关的源…...

Python Opencv鼠标回调

使用 OpenCV 的 cv2.setMouseCallback() 方法来捕捉鼠标事件&#xff0c;并实现以下功能&#xff1a; 实时在鼠标指针附近显示其位置的像素坐标。通过左键双击&#xff0c;将像素坐标记录到数组中。通过右键点击&#xff0c;取消上一次添加的坐标。 下面是实现代码的示例&…...

Ubuntu环境的MySql下载安装

下载压缩包 此文章下载的mysql版本位5.7.29 sudo wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar解压缩 sudo tar -xvf mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar命令解释 -x&#xff1a;…...

Android系统去掉WIFI模块

先说应用场景&#xff0c;有些特定设备&#xff0c;不能连接wifi。需要隐藏的模块&#xff0c;QS面板模块的wifi,还有设置里面的wifi.由于QS属于SystemUI&#xff0c;熟悉SystemUI之后&#xff0c;就可以直接去SystemUi那里找&#xff0c;找到QSTitle 默认配置的地方。 一、…...

代码随想录 -- 二叉树 -- 翻转二叉树

226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 递归比较简单 class Solution(object):def invertTree(self, root):if rootNone:returnnode rootif node.left or node.right:tempnode.leftnode.leftnode.rightnode.righttempself.invertTree(node.left)self.inve…...

Node.js之文件复制

1.方式一&#xff1a;readFile // 导入fs模块 const fs require("fs") // 导入process模块 const process require("process")// 读取文件内容 let data fs.writeFileSync(./test.txt) // 写入文件内容 fs.writeFileSync(./test1.txt, data) 2.方式二&…...

新手c语言讲解及题目分享(十六)--文件系统专项练习

在我刚开始学习c语言的时候就跳过了这一章节&#xff0c;但在后面慢慢发现这一章节还是比较重要的,如果你报考了计算机二级c语言的话&#xff0c;你应该可以看到后面的三个大题有时会涉及到这章。所以说这章还是非常重要的。 目录 前言 一.打开文件 1.Fopen( )函数返回值 2&…...

RabbitMQ本地Ubuntu系统环境部署与无公网IP远程连接服务端实战演示

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 安装内网穿透工具3.1 安装cpolar内网穿透3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&am…...

[C++#28][多态] 两个条件 | 虚函数表 | 抽象类 | override 和 final | 重载 重写 重定义

目录 0.引入 1.虚函数 1. 虚函数的重写/覆盖 2. 特例1&#xff1a;不加 virtual 关键字的重写 3. 特例2&#xff1a;协变&#xff08;了解&#xff09; 2.多态的构成和细节 1. C11 的 override 和 final 1. final 不可重写 2. override 报错检查 ⭕2. 重载、覆盖&…...

List 集合指定值升序降序排列Comparator实现

升序排序 升序排序通常是指从小到大的排序。对于数值类型来说&#xff0c;可以直接使用 compareTo 方法&#xff0c;而对于其他类型&#xff0c;可以根据实际需求实现比较逻辑。 示例代码 import java.util.Comparator; import java.util.List; import java.util.ArrayList;cl…...

【Day07】

目录 MySQL-DQL- 基本查询 MySQL-DQL- 条件查询 MySQL-DQL- 聚合函数 MySQL-DQL- 分组查询 MySQL-DQL- 排序查询 MySQL-DQL- 分页查询 MySQL-DQL- 案例 MySQL-多表设计-一对多 MySQL-多表设计-一对多-外键约束 MySQL-多表设计-一对一&多对多 MySQL-多表设计-案例…...

shell 控制台显示彩色文字的方法

在shell脚本中,如果我们希望在控制台能显示带颜色的文字, 那就需要使用shell中的色彩专用变量代码来进行. shell中的各种颜色代码定义 # 颜色定义 BLACK"\033[0;30m" DARK_GRAY"\033[1;30m" BLUE"\033[0;34m" LIGHT_BLUE"\033[1;3…...

Nginx: 缓存, 不缓存特定内容和缓存失效降低上游压力策略及其配置示例

概述 在负载均衡的过程中&#xff0c;有一个比较重要的概念&#xff0c;就是缓存利用缓存可以很好协调Nginx在客户端和上游服务器之间的速度不匹配的矛盾从而很好的解决整体系统的响应速度 如果用户需要通过Nginx获取某一些内容的时候&#xff0c;发起一个request请求这个请求…...

Python 全栈系列266 Kafka服务的Docker搭建

说明 在大量数据处理任务下的缓存与分发 这个算是来自顾同学的助攻1&#xff0c;我有点java绝缘体的体质&#xff0c;碰到和java相关的安装部署总会碰到点奇怪的问题&#xff0c;不过现在已经搞定了。测试也接近了kafka官方标称的性能。考虑到网络、消息的大小等因素&#xff0…...

集合框架,List常用API,栈和队列初识

回顾 集合框架 两个重点——ArrayList和HashSet. Vector/ArraysList/LinkedList区别 VectorArraysListLinkedList底层实现数组数组链表线程安全安全不安全不安全增删效率较低较低高扩容*2*1.5-------- &#xff08;>>&#xff09;运算级最低&#xff0c;记得加括号。 常…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...