FastDFS VS MinIO:文件存储与对象存储的抉择(包含SpringBoot集成FastDFS范例)
FastDFS vs MinIO:文件存储与对象存储的抉择(包含SpringBoot集成FastDFS范例)
我坐在窗边,随着飞机穿过云层,在云层之上滑翔。可以清晰的看到飞机在天空留下的痕迹,不知道那是蔚蓝中的纯白,还是白色中的清澈……云层之上的天空没有一丝瑕疵,那样的完整,包笼着绵绵的云。
FastDFS 是一个开源的分布式文件系统,专为高性能的分布式文件存储设计,适用于大型分布式系统中海量文件的存储、同步和访问。FastDFS 主要用于解决海量文件的高效管理问题,尤其在图像、视频等需要大量文件存储和读取的应用场景中非常流行。
课程视频资源(来自于阿里云课堂)
FastDFS 主要特点
- 高性能:FastDFS 专注于文件的上传、下载和存储操作,提供了高效的 IO 操作。
- 分布式存储:通过 Master/Slave 架构,支持多台服务器,形成集群,从而具备水平扩展能力。
- 负载均衡:自动支持文件的负载均衡和故障转移,文件存储和访问更加灵活。
- 支持大文件和小文件:无论是小文件(如图片、文本文件)还是大文件(如视频),FastDFS 都能够高效处理。
- 易于集成:支持 HTTP、Nginx 插件以及其他客户端 API,方便集成到现有的应用中。
- 文件属性管理:支持文件的元信息存储,方便管理文件相关的属性。
FastDFS VS Minio
1. 基本介绍
FastDFS
- 概述:FastDFS 是一个专为分布式文件存储设计的开源系统,主要用于解决海量文件存储和访问问题。它提供了文件上传、下载、同步、备份、负载均衡等功能,广泛应用于海量图片、视频存储的场景。
- 应用场景:FastDFS 适合对文件进行大规模分布式存储的场景,尤其是对文件系统层次结构要求较少、需要海量小文件存储的场景。
MinIO
- 概述:MinIO 是一个高性能的对象存储系统,完全兼容 Amazon S3 API。它的设计目标是提供高效的云原生对象存储服务,支持海量大文件的存储和访问,适用于云存储和大数据存储场景。
- 应用场景:MinIO 主要用于云原生应用、大数据分析、备份和恢复等场景,适合存储和管理较大文件的数据集。
2. 架构对比
FastDFS
-
组件架构:
- Tracker Server:负责客户端与存储服务器之间的通信调度,跟踪文件的位置和元数据信息。
- Storage Server:负责实际的文件存储,支持多副本和数据冗余。
- Client:客户端通过 Tracker Server 与 Storage Server 交互,实现文件上传、下载、删除等操作。
-
存储方式:FastDFS 基于文件存储,文件以分组的方式存储在不同的 Storage Server 上,不提供类似对象存储的 API。
-
数据一致性:通过 Tracker 和 Storage 之间的主从复制机制实现数据的冗余和同步。
MinIO
-
组件架构:
- 单一守护进程:MinIO 的架构更加简洁,所有功能(如对象存储、访问控制、扩展等)都由一个守护进程提供。
- 分布式模式:支持将多个 MinIO 节点组成集群,提供数据分片、冗余和负载均衡功能。
-
存储方式:基于对象存储,完全兼容 S3 API,所有文件以对象的形式存储,并允许通过 HTTP 协议进行管理和访问。
-
数据一致性:通过纠删码 (Erasure Coding) 提供数据冗余和高可用性,可以在磁盘故障或节点丢失时保持数据完整性。
3. 数据访问和协议
FastDFS
- 数据访问:文件的上传和下载通过专用的客户端 API 实现。默认情况下,它通过 TCP 进行文件传输,可以通过 Nginx 代理实现 HTTP 访问。
- 协议支持:FastDFS 不支持标准的对象存储协议,主要依赖其自身定义的协议和 API。通过客户端 SDK(如 Java、C 等语言)进行文件管理。
MinIO
- 数据访问:基于标准的 Amazon S3 API,支持 RESTful API 访问文件,可以使用标准的 S3 客户端工具(如
aws-cli
、MinIO 控制台等)与 MinIO 交互。 - 协议支持:支持 S3 协议,因此可以无缝集成到现有的 S3 应用和生态系统中,方便与 AWS、Azure、Google Cloud 等其他云服务互通。
4. 性能和扩展性
FastDFS
- 性能:FastDFS 在处理小文件时表现出色,适合大量小文件(如图片、视频缩略图等)的存储和管理。由于它专注于文件的高效上传、下载和存储,性能表现稳定。
- 扩展性:通过增加 Tracker 和 Storage 节点实现横向扩展,但大规模集群的扩展和管理会变得较为复杂,尤其在元数据管理方面。
MinIO
- 性能:MinIO 针对大文件的存储和传输进行了高度优化,能够快速存储、访问和管理大量数据。其设计目标是处理海量数据,适合大数据分析、视频流媒体等场景。
- 扩展性:MinIO 支持高度可扩展的分布式部署,能够通过增加节点和磁盘轻松扩展集群容量,并支持水平扩展至多个数据中心。
5. 数据冗余和容错性
FastDFS
- 数据冗余:通过主从复制实现数据冗余,支持多副本存储,保证数据在硬件故障或服务器宕机时不丢失。
- 容错性:通过 Tracker Server 进行负载均衡和容错处理,但缺少 MinIO 的纠删码机制,故障恢复速度较慢,且对单点故障容忍性较低。
MinIO
- 数据冗余:使用纠删码(Erasure Coding)实现数据冗余,允许在磁盘故障或节点丢失时保持数据的高可用性,并且在更少的存储空间下提供冗余。
- 容错性:MinIO 能够容忍多个节点或磁盘同时故障,并通过内置的自动修复机制保持数据的可用性和一致性。
6. 管理和监控
FastDFS
- 管理工具:FastDFS 提供了一些基本的命令行工具用于集群的监控和管理,但界面化管理能力有限。通常需要第三方工具来实现可视化管理。
- 监控:依赖于手动脚本和日志进行监控,集群管理和扩展较为复杂。
MinIO
- 管理工具:MinIO 提供了基于 Web 的管理界面,用户可以方便地管理对象存储、监控集群状态、设置访问权限等。
- 监控:支持 Prometheus 等监控系统,能够轻松集成到现有的监控体系中,提供丰富的可视化和告警功能。
7. 安全性
FastDFS
- 权限控制:FastDFS 本身并不提供细粒度的权限控制,通常需要通过结合 Nginx 或其他外部服务来实现基于 IP 或 Token 的访问控制。
- 传输安全:FastDFS 没有内置的加密机制,传输层的安全性通常依赖于其他工具(如 HTTPS 代理)实现。
MinIO
- 权限控制:MinIO 完全兼容 S3 的访问控制策略(ACLs),可以对每个对象或存储桶设置细粒度的权限。
- 传输安全:MinIO 内置了 TLS 支持,能够在数据传输过程中加密,确保数据安全。
8. 集成和生态
FastDFS
- 集成:FastDFS 提供的客户端 SDK 适合与自定义系统进行集成,但由于缺乏标准化接口和协议,不太适合与现代云原生应用集成。
- 生态系统:FastDFS 的生态相对较小,主要用于专用的文件存储系统,依赖较多手工操作和自定义开发。
MinIO
- 集成:MinIO 由于完全兼容 S3 API,因此能够无缝集成到 AWS、Kubernetes、大数据分析系统等各种现代化云原生平台中。
- 生态系统:MinIO 具有广泛的生态系统支持,能与大量现有工具、服务(如 Hadoop、Spark、Kubernetes 等)直接集成,方便使用和扩展。
9.总结对比表
特性 | FastDFS | MinIO |
---|---|---|
存储类型 | 文件存储 | 对象存储 |
架构 | Tracker-Storage 分离 | 单一守护进程,支持分布式 |
协议支持 | 专有协议 | S3 兼容,支持 HTTP/REST API |
数据冗余 | 主从复制,多副本 | 纠删码,多节点和磁盘故障容错 |
性能 | 适合小文件存储,上传/下载性能较高 | 高性能,适合大文件和海量数据存储 |
扩展性 | 可扩展但管理复杂 | 高度可扩展,支持水平扩展 |
管理工具 | 命令行工具 | Web 界面,支持 Prometheus 监控 |
生态系统 | 生态相对较小,集成 |
FastDFS 的安装和使用
1. 安装步骤(简略版)
- 安装依赖:一般需要依赖
libevent
、libfastcommon
等库。 - 下载 FastDFS 的源码并编译安装。
- 配置
tracker
和storage
的配置文件,启动对应的服务。
2. 配置文件
- tracker.conf:跟踪服务器的配置,主要包括端口、日志、数据目录等。
- storage.conf:存储服务器的配置,包含数据存储目录、日志、端口等。
3. 常用命令
- 启动服务:
fdfs_trackerd /path/to/conf
- 上传文件:
fdfs_upload_file /path/to/client.conf /path/to/file
- 下载文件:
fdfs_download_file /path/to/client.conf file_id
4.应用场景
- 图片和视频存储:大规模图片、视频文件的分布式存储,像电商平台、社交媒体平台等都可以使用 FastDFS 来存储用户上传的图片和视频。
- CDN 文件分发:通过 FastDFS 与 Nginx 集成,可以作为 CDN 系统的一部分,实现文件的高效分发和缓存。
- 日志和数据归档:FastDFS 也适合用于大规模的日志和数据归档管理,确保文件的高可用性和安全性。
5.常见问题
- 文件存储效率:FastDFS 对于小文件的存储效率较高,但如果存储大量大文件,可能需要结合其他技术优化。
- 扩展性:虽然 FastDFS 可以横向扩展存储节点,但集群规模增大时,跟踪服务器的性能可能成为瓶颈。
- 元数据管理:FastDFS 中文件的元数据存储在 Tracker Server 中,如果集群中的文件过多,元数据的存储和查询会受到影响。
结合 Spring Boot 使用 FastDFS
结合 Spring Boot 使用 FastDFS 来实现文件上传、下载等操作,是一个常见的文件管理解决方案,尤其适用于分布式存储场景。通过将 FastDFS 集成到 Spring Boot 项目中,你可以实现文件的高效存储和访问。
1. 环境准备
在开始之前,需要保证 FastDFS 环境已经搭建完毕,包含:
- FastDFS 的 Tracker Server(负责调度)。
- Storage Server(负责文件的存储)。
- 安装并启动 FastDFS 所需的依赖库(如
libfastcommon
和FastDFS
服务)。
你还需要配置 Nginx 作为 HTTP 代理,以便通过 HTTP 协议访问文件。
2. FastDFS 配置和 Nginx 配置
FastDFS 默认提供的访问方式为 TCP 协议,通常我们会结合 Nginx 代理来提供基于 HTTP 的文件访问。
FastDFS 主要配置
- tracker.conf:配置
Tracker Server
的监听端口和日志目录。 - storage.conf:配置存储服务器的存储目录和绑定 IP 地址。
- client.conf:客户端的配置,用于连接
Tracker Server
,一般会在 Spring Boot 项目中使用。
Nginx 配置
Nginx 代理 FastDFS 的静态文件,可以通过 HTTP 访问存储的文件:
server {listen 80;server_name localhost;location /group1/M00/ {root /data/fastdfs/data; # FastDFS 的存储路径ngx_fastdfs_module;}
}
3. 在 Spring Boot 项目中集成 FastDFS
要将 FastDFS 集成到 Spring Boot 项目中,需要以下步骤:
引入依赖
首先,在 pom.xml
中引入 FastDFS 的 Java 客户端依赖。你可以使用 Maven 中已有的 FastDFS 客户端库,比如:
<dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>1.27.1</version> <!-- 确保使用最新版本 -->
</dependency>
配置 FastDFS 客户端
创建 FastDFS
的配置文件 application.yml
或 application.properties
,指定 Tracker Server 地址。
fdfs:so-timeout: 1500connect-timeout: 600tracker-list: 192.168.0.100:22122 # 配置 Tracker Server 地址thumb-image:width: 150height: 150
配置 FastDFS 客户端的 Java 组件
在 Spring Boot 项目中配置 FastDFS 客户端工具类。以下是一个简单的工具类实现,用于文件上传、下载和删除操作:
package com.example.fastdfs;import com.github.tobato.fastdfs.domain.fdfs.MetaData;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.HashSet;
import java.util.Set;@Component
public class FastDFSClient {@Autowiredprivate FastFileStorageClient storageClient;// 文件上传public String uploadFile(MultipartFile file) throws IOException {String originalFilename = file.getOriginalFilename();String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);Set<MetaData> metaDataSet = new HashSet<>();metaDataSet.add(new MetaData("Author", "SpringBoot"));metaDataSet.add(new MetaData("FileName", originalFilename));// 上传文件并获取存储路径StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), fileExtension, metaDataSet);return storePath.getFullPath(); // 返回文件完整路径}// 文件下载public byte[] downloadFile(String fileUrl) {StorePath storePath = StorePath.parseFromUrl(fileUrl);byte[] fileBytes = storageClient.downloadFile(storePath.getGroup(), storePath.getPath(), inputStream -> {try {return inputStream.readAllBytes();} catch (IOException e) {throw new RuntimeException("下载文件失败", e);}});return fileBytes;}// 删除文件public void deleteFile(String fileUrl) {StorePath storePath = StorePath.parseFromUrl(fileUrl);storageClient.deleteFile(storePath.getGroup(), storePath.getPath());}
}
创建文件上传、下载的 API
在 Spring Boot 中创建控制器,提供文件的上传、下载和删除接口。
package com.example.fastdfs;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;@RestController
@RequestMapping("/file")
public class FileController {@Autowiredprivate FastDFSClient fastDFSClient;// 文件上传接口@PostMapping("/upload")public String uploadFile(@RequestParam("file") MultipartFile file) {try {return fastDFSClient.uploadFile(file); // 返回上传后的文件路径} catch (Exception e) {return "上传失败: " + e.getMessage();}}// 文件下载接口@GetMapping("/download")public ResponseEntity<byte[]> downloadFile(@RequestParam String fileUrl) {byte[] fileBytes = fastDFSClient.downloadFile(fileUrl);// 设置响应头HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);headers.setContentDispositionFormData("attachment", "downloadedFile");return ResponseEntity.ok().headers(headers).body(fileBytes);}// 文件删除接口@DeleteMapping("/delete")public String deleteFile(@RequestParam String fileUrl) {try {fastDFSClient.deleteFile(fileUrl);return "删除成功";} catch (Exception e) {return "删除失败: " + e.getMessage();}}
}
运行和测试
- 运行 Spring Boot 应用程序后,可以通过 Postman 或其他 HTTP 客户端来测试文件上传、下载和删除操作。
- 上传:通过 POST 请求
/file/upload
上传文件。 - 下载:通过 GET 请求
/file/download
提供文件的完整路径来下载文件。 - 删除:通过 DELETE 请求
/file/delete
提供文件路径来删除文件。
总结
通过 FastDFS 与 Spring Boot 的集成,能够轻松实现分布式文件存储和访问。FastDFS 提供了高效的文件存储、读取和删除功能,而 Spring Boot 提供了 RESTful API 接口来管理文件操作,适合用在图片存储、视频分发等场景。
相关文章:

FastDFS VS MinIO:文件存储与对象存储的抉择(包含SpringBoot集成FastDFS范例)
FastDFS vs MinIO:文件存储与对象存储的抉择(包含SpringBoot集成FastDFS范例) 我坐在窗边,随着飞机穿过云层,在云层之上滑翔。可以清晰的看到飞机在天空留下的痕迹,不知道那是蔚蓝中的纯白,还是…...

【Redis】缓存预热、雪崩、击穿、穿透、过期删除策略、内存淘汰策略
Redis常见问题总结: Redis常见问题总结Redis缓存预热Redis缓存雪崩Redis缓存击穿Redis缓存穿透 Redis 中 key 的过期删除策略数据删除策略 Redis内存淘汰策略一、Redis对过期数据的处理(一)相关配置(二)内存淘汰流程&a…...

【LeetCode】每日一题 2024_10_15 三角形的最大高度(枚举、模拟)
前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 题目:三角形的最大高度 代码与解题思路 久违的简单题 这道题读完题目其实不难想到有两条路可以走: 1、题目很明显只有两种情况,枚举是第一个球是红球还是蓝球这两种情…...

2024版最新网络安全工程师入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
前言 想要成为网络安全工程师,却苦于没有方向,不知道从何学起的话,下面这篇 网络安全入门 教程可以帮你实现自己的网络安全工程师梦想,如果想学,可以继续看下去,文章有点长,希望你可以耐心看到…...

vue中关于router.beforeEach()的用法
router.beforeEach()是Vue.js中的路由守卫,用于在路由跳转前进行校验、取消、重定向等操作。 基本使用: const router new VueRouter({ ... })router.beforeEach((to, from, next) > {// ... }) to: 即将要进入的目标路由对象 from: 当前导航正要…...

C++模板初阶,只需稍微学习;直接起飞;泛型编程
🤓泛型编程 假设像以前交换两个函数需要,函数写很多个或者要重载很多个;那么有什么办法实现一个通用的函数呢? void Swap(int& x, int& y) {int tmp x;x y;y tmp; } void Swap(double& x, double& y) {doubl…...

【数据结构 | 红黑树】红黑树的性质和插入结点时的调整
文章目录 红黑树红黑树插入时的调整?1. 插入结点是根结点2. 插入结点的叔叔是红色3. 插入结点的叔叔是黑色LL 型RR型LR型RL型 红黑树 前提:二叉搜索树(左 < 根 < 右)—— 左根右根和**叶子(NULL)**都…...

mysql学习教程,从入门到精通,SQL导入数据(44)
1.SQL 导出数据 以下是一个关于如何使用 SQL 导出数据的示例。这个示例将涵盖从一个关系数据库管理系统(如 MySQL)中导出数据到 CSV 文件的基本步骤。 1.1、前提条件 你已经安装并配置好了 MySQL 数据库。你有访问数据库的权限。你知道要导出的表名。…...

【SpringAI】(二)让你的Java程序接入大模型——适合Java宝宝的大模型应用开发
开始之前,如果你对大模型完全没了解过,建议阅读之前的大模型入门文章: 【SpringAI】(一)从实际场景入门大模型——适合Java宝宝的大模型应用开发 那么今天就开始写一个基于Spring AI程序的HelloWord!将大模型接入到咱…...

音频剪辑在线工具 —— 让声音更精彩
你是否曾梦想过拥有自己的声音创作空间,却苦于复杂的音频编辑软件?接下来,让我们一同揭开这些音频剪辑在线工具的神秘面纱,看看它们如何帮助你实现从录音到发布的无缝衔接。 1.福昕音频剪辑 链接直达>>https://www.foxits…...

http短连接和长连接
参考短连接和长连接 短连接:客户端向服务器每进行一次Http操作,都需建立一次连接,任务完成后,断开连接;长连接:建立长连接后,传输数据的连接将不会中断,客户端每次访问服务器时都会…...

日志分析删除
日志分析 场景 运维嫌弃生产环境打印日志过多,而且日志存储需要费用,让我们减少打印日志大小,所以需要分析日志在哪里打印的过多 解决方案 读取生产日志文件,统计分析打印日志的地方,最后删除代码中打印日志的地方…...

DART: Implicit Doppler Tomography for Radar Novel View Synthesis 笔记
Link:https://wiselabcmu.github.io/dart/ Publish: 2024CVPR Abstract DART主要任务就是用来合成雷达距离多普勒图像range-droppler,可用于生成高质量的断层扫描图像。 Related Work 1 Radar Simulation 基于模型的方法 任务ÿ…...

redis-cli执行lua脚本
连接redis服务器命令 redis-cli -h 10.10.xx.xx -p 6380 -a password执行lua脚本传递KEY VALUE redis-cli -h 10.10.xx.xx -p 6380 -a password key1 key2 , arg1 arg2key和参数通过逗号分割,逗号前后必须有一个空格 如下执行lua脚本示例: -- script.…...

MySQL9的3个新特性
【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) 本文讲解MySQL9的3个新特性&…...

《网络基础之 HTTP 协议:状态码含义全解析》
《网络基础之 HTTP 协议:状态码含义全解析》 在网络通信的浩瀚世界中,HTTP 协议犹如一座坚实的桥梁,连接着客户端与服务器。而其中的状态码,则是这座桥梁上的重要标识,为双方的交互提供了关键的反馈信息。 一、状态码…...

java真的正在越来越失去竞争力了吗
题记: java真的在越来越失去竞争力了吗?最近参加校招面试,过程中有问道java的问题,有的同学很直接了当(或者是不假思索)地说,java已经过时了吧,现在学java的人越来越少了。那么事实…...

【通过zip方式安装mysql服务】
通过zip方式安装mysql服务 Mysql安装包下载mysql安装及环境配置1.解压缩配置环境变量初始化mysql配置安装mysql服务启动MySQL服务连接mysql修改root用户密码 Mysql安装包下载 通过访问mysql官网下载:mysql下载地址 mysql安装及环境配置 1.解压缩 下载完成后&am…...

每日OJ题_WY3小易的升级之路_数学模拟_C++_Java
目录 牛客_WY3小易的升级之路_数学模拟 题目解析 C代码 Java代码 牛客_WY3小易的升级之路_数学模拟 小易的升级之路_牛客题霸_牛客网 (nowcoder.com) 描述: 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段…...

python xml的读取和写入
import xml.etree.ElementTree as ET from xml.dom import minidom# 读取XML文档 tree ET.parse("./xml_3/z_20240827_001.xml") root tree.getroot() # 获取size元素 size_find_0 root.find("size") # 获取width子元素 size_w size_find_0.find("…...

WebGL 小白入门学习
1. WebGL是什么? WebGL(Web Graphics Library)是一种JavaScript API,它允许你在不需要安装任何额外插件的情况下,直接在浏览器中渲染高性能的2D和3D图形。WebGL利用了用户的图形处理单元(GPU)来…...

OSI七层协议
OSI(Open System Interconnection)七层协议,即开放式系统互联参考模型,是一个由国际标准化组织(ISO)提出的用于描述计算机网络中通信的结构和功能的理论模型。它将网络通信过程分为七个层次,每个…...

超平面(Hyperplane)和半空间(Halfspace)
文章目录 一、超平面(Hyperplane)1. 定义2. 超平面的方程3. 例子4. 超平面的性质 二、半空间(Halfspace)1. 定义2. 半空间的表示3. 半空间的性质 三、超平面与半空间的关系四、应用1. 线性规划2. 机器学习3. 计算几何4. 凸分析 五…...

TCP(Transmission Control Protocol,传输控制协议)整理
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的传输协议,它是OSI(Open System Interconnection,开放式系统互联)模型中的第四层协议,通常使用于网络中的…...

R语言绘制线性回归图
线性回归图以二维坐标系展示两个变量关系。数据点代表实际观测值,核心是线性回归线。此线通过统计方法确定,与数据点距离平方和最小。它反映变量间线性趋势,斜率正负决定相关方向。可用于预测因变量值,也能进行推断统计。在数据分…...

C++进阶:map和set的使用
目录 一.序列式容器和关联式容器 二.set系列的使用 2.1set容器的介绍 2.2set的构造和迭代器 2.3set的增删查 2.4insert和迭代器遍历的样例 2.5find和erase的样例 编辑 2.6multiset和set的差异 2.7简单用set解决两道题 两个数组的交集 环形链表二 三.map系列的使用…...

深入理解C++ STL中的 vector
文章目录 1. vector 的概述1.1 vector 是什么?1.2 vector 的优点1.3 vector 的缺点 2. vector 的基本使用2.1 vector 的定义2.2 基本操作2.3 示例2.4 迭代器的使用 3. vector 的内部实现原理3.1 动态数组的实现3.2 内存管理3.3 内存扩展策略3.4 元素的插入与删除3.4…...

MySQL 安装与配置详细教程
MySQL 安装与配置详细教程 MySQL 是一款流行的关系型数据库管理系统,广泛应用于 Web 应用和应用程序中。在本文中,我们将提供一份详细的 MySQL 安装与配置教程,帮助初学者快速上手。 ## 1. 安装 MySQL 首先,我们需要从 MySQL 官…...

理解智能合约:区块链在Web3中的运作机制
随着区块链技术的不断发展,“智能合约”这一概念变得越来越重要。智能合约是区块链应用的核心之一,正在推动Web3的发展,为数字世界带来了前所未有的自动化和信任机制。本文将深入探讨智能合约的基本原理、运作机制,以及它在Web3生…...

QT工程概述
在Qt中,创建 "MainWindow" 与 "Widget" 项目的主要区别在于他们的用途和功能范围: MainWindow:这是一个包含完整菜单栏、工具栏和状态栏的主窗口应用程序框架。它适合于更复 杂的应用程序,需要这些额外的用户…...