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

FastDFS VS MinIO:文件存储与对象存储的抉择(包含SpringBoot集成FastDFS范例)

FastDFS vs MinIO:文件存储与对象存储的抉择(包含SpringBoot集成FastDFS范例)

在这里插入图片描述

我坐在窗边,随着飞机穿过云层,在云层之上滑翔。可以清晰的看到飞机在天空留下的痕迹,不知道那是蔚蓝中的纯白,还是白色中的清澈……云层之上的天空没有一丝瑕疵,那样的完整,包笼着绵绵的云。

FastDFS 是一个开源的分布式文件系统,专为高性能的分布式文件存储设计,适用于大型分布式系统中海量文件的存储、同步和访问。FastDFS 主要用于解决海量文件的高效管理问题,尤其在图像、视频等需要大量文件存储和读取的应用场景中非常流行。

课程视频资源(来自于阿里云课堂)

FastDFS 主要特点

  1. 高性能:FastDFS 专注于文件的上传、下载和存储操作,提供了高效的 IO 操作。
  2. 分布式存储:通过 Master/Slave 架构,支持多台服务器,形成集群,从而具备水平扩展能力。
  3. 负载均衡:自动支持文件的负载均衡和故障转移,文件存储和访问更加灵活。
  4. 支持大文件和小文件:无论是小文件(如图片、文本文件)还是大文件(如视频),FastDFS 都能够高效处理。
  5. 易于集成:支持 HTTP、Nginx 插件以及其他客户端 API,方便集成到现有的应用中。
  6. 文件属性管理:支持文件的元信息存储,方便管理文件相关的属性。

FastDFS VS Minio

1. 基本介绍

FastDFS
  • 概述:FastDFS 是一个专为分布式文件存储设计的开源系统,主要用于解决海量文件存储和访问问题。它提供了文件上传、下载、同步、备份、负载均衡等功能,广泛应用于海量图片、视频存储的场景。
  • 应用场景:FastDFS 适合对文件进行大规模分布式存储的场景,尤其是对文件系统层次结构要求较少、需要海量小文件存储的场景。
MinIO
  • 概述:MinIO 是一个高性能的对象存储系统,完全兼容 Amazon S3 API。它的设计目标是提供高效的云原生对象存储服务,支持海量大文件的存储和访问,适用于云存储和大数据存储场景。
  • 应用场景:MinIO 主要用于云原生应用、大数据分析、备份和恢复等场景,适合存储和管理较大文件的数据集。

2. 架构对比

FastDFS
  • 组件架构

    1. Tracker Server:负责客户端与存储服务器之间的通信调度,跟踪文件的位置和元数据信息。
    2. Storage Server:负责实际的文件存储,支持多副本和数据冗余。
    3. Client:客户端通过 Tracker Server 与 Storage Server 交互,实现文件上传、下载、删除等操作。
  • 存储方式:FastDFS 基于文件存储,文件以分组的方式存储在不同的 Storage Server 上,不提供类似对象存储的 API。

  • 数据一致性:通过 Tracker 和 Storage 之间的主从复制机制实现数据的冗余和同步。

MinIO
  • 组件架构

    1. 单一守护进程:MinIO 的架构更加简洁,所有功能(如对象存储、访问控制、扩展等)都由一个守护进程提供。
    2. 分布式模式:支持将多个 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.总结对比表

特性FastDFSMinIO
存储类型文件存储对象存储
架构Tracker-Storage 分离单一守护进程,支持分布式
协议支持专有协议S3 兼容,支持 HTTP/REST API
数据冗余主从复制,多副本纠删码,多节点和磁盘故障容错
性能适合小文件存储,上传/下载性能较高高性能,适合大文件和海量数据存储
扩展性可扩展但管理复杂高度可扩展,支持水平扩展
管理工具命令行工具Web 界面,支持 Prometheus 监控
生态系统生态相对较小,集成

FastDFS 的安装和使用

1. 安装步骤(简略版)

  • 安装依赖:一般需要依赖 libeventlibfastcommon 等库。
  • 下载 FastDFS 的源码并编译安装。
  • 配置 trackerstorage 的配置文件,启动对应的服务。

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.常见问题

  1. 文件存储效率:FastDFS 对于小文件的存储效率较高,但如果存储大量大文件,可能需要结合其他技术优化。
  2. 扩展性:虽然 FastDFS 可以横向扩展存储节点,但集群规模增大时,跟踪服务器的性能可能成为瓶颈。
  3. 元数据管理:FastDFS 中文件的元数据存储在 Tracker Server 中,如果集群中的文件过多,元数据的存储和查询会受到影响。

结合 Spring Boot 使用 FastDFS

结合 Spring Boot 使用 FastDFS 来实现文件上传、下载等操作,是一个常见的文件管理解决方案,尤其适用于分布式存储场景。通过将 FastDFS 集成到 Spring Boot 项目中,你可以实现文件的高效存储和访问。

1. 环境准备

在开始之前,需要保证 FastDFS 环境已经搭建完毕,包含:

  • FastDFS 的 Tracker Server(负责调度)。
  • Storage Server(负责文件的存储)。
  • 安装并启动 FastDFS 所需的依赖库(如 libfastcommonFastDFS 服务)。

你还需要配置 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.ymlapplication.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&#xff1a;文件存储与对象存储的抉择&#xff08;包含SpringBoot集成FastDFS范例&#xff09; 我坐在窗边&#xff0c;随着飞机穿过云层&#xff0c;在云层之上滑翔。可以清晰的看到飞机在天空留下的痕迹&#xff0c;不知道那是蔚蓝中的纯白&#xff0c;还是…...

【Redis】缓存预热、雪崩、击穿、穿透、过期删除策略、内存淘汰策略

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

【LeetCode】每日一题 2024_10_15 三角形的最大高度(枚举、模拟)

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

2024版最新网络安全工程师入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

前言 想要成为网络安全工程师&#xff0c;却苦于没有方向&#xff0c;不知道从何学起的话&#xff0c;下面这篇 网络安全入门 教程可以帮你实现自己的网络安全工程师梦想&#xff0c;如果想学&#xff0c;可以继续看下去&#xff0c;文章有点长&#xff0c;希望你可以耐心看到…...

vue中关于router.beforeEach()的用法

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

C++模板初阶,只需稍微学习;直接起飞;泛型编程

&#x1f913;泛型编程 假设像以前交换两个函数需要&#xff0c;函数写很多个或者要重载很多个&#xff1b;那么有什么办法实现一个通用的函数呢&#xff1f; void Swap(int& x, int& y) {int tmp x;x y;y tmp; } void Swap(double& x, double& y) {doubl…...

【数据结构 | 红黑树】红黑树的性质和插入结点时的调整

文章目录 红黑树红黑树插入时的调整&#xff1f;1. 插入结点是根结点2. 插入结点的叔叔是红色3. 插入结点的叔叔是黑色LL 型RR型LR型RL型 红黑树 前提&#xff1a;二叉搜索树&#xff08;左 < 根 < 右&#xff09;—— 左根右根和**叶子&#xff08;NULL&#xff09;**都…...

mysql学习教程,从入门到精通,SQL导入数据(44)

1.SQL 导出数据 以下是一个关于如何使用 SQL 导出数据的示例。这个示例将涵盖从一个关系数据库管理系统&#xff08;如 MySQL&#xff09;中导出数据到 CSV 文件的基本步骤。 1.1、前提条件 你已经安装并配置好了 MySQL 数据库。你有访问数据库的权限。你知道要导出的表名。…...

【SpringAI】(二)让你的Java程序接入大模型——适合Java宝宝的大模型应用开发

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

音频剪辑在线工具 —— 让声音更精彩

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

​http短连接和长连接​

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

日志分析删除

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

DART: Implicit Doppler Tomography for Radar Novel View Synthesis 笔记

Link&#xff1a;https://wiselabcmu.github.io/dart/ Publish&#xff1a; 2024CVPR Abstract DART主要任务就是用来合成雷达距离多普勒图像range-droppler&#xff0c;可用于生成高质量的断层扫描图像。 Related Work 1 Radar Simulation 基于模型的方法 任务&#xff…...

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和参数通过逗号分割&#xff0c;逗号前后必须有一个空格 如下执行lua脚本示例&#xff1a; -- script.…...

MySQL9的3个新特性

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

《网络基础之 HTTP 协议:状态码含义全解析》

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

java真的正在越来越失去竞争力了吗

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

【通过zip方式安装mysql服务】

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

每日OJ题_WY3小易的升级之路_数学模拟_C++_Java

目录 牛客_WY3小易的升级之路_数学模拟 题目解析 C代码 Java代码 牛客_WY3小易的升级之路_数学模拟 小易的升级之路_牛客题霸_牛客网 (nowcoder.com) 描述&#xff1a; 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 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是什么&#xff1f; WebGL&#xff08;Web Graphics Library&#xff09;是一种JavaScript API&#xff0c;它允许你在不需要安装任何额外插件的情况下&#xff0c;直接在浏览器中渲染高性能的2D和3D图形。WebGL利用了用户的图形处理单元&#xff08;GPU&#xff09;来…...

OSI七层协议

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

超平面(Hyperplane)和半空间(Halfspace)

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

TCP(Transmission Control Protocol,传输控制协议)整理

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

R语言绘制线性回归图

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

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

理解智能合约:区块链在Web3中的运作机制

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

QT工程概述

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