MinIO 教程:從入門到Spring Boot集成

文章目錄

  • 一. MinIO 簡介
    • 1. 什么是MinIO?
    • 2. 應用場景
  • 二. 文件系統存儲發展史
    • 1. 服務器磁盤(本地存儲)
    • 2. 分布式文件系統(如 HDFS、Ceph、GlusterFS)
    • 3. 對象存儲(如 MinIO、AWS S3)
    • 4.對比總結
    • 5.選型建議
    • 6.示例方案
  • 三.MinIO基礎概念
    • MinIO的基礎概念
    • MinIO 糾刪碼 EC (Erasure Code)
  • 三. MinIO 安裝指南
    • 1 單機部署
    • 2 分布式集群部署
    • 3 Docker 部署
  • 四. MinIO 基礎使用
    • 1. 基礎命令
      • 1.1 安裝與配置
    • 2. 存儲桶管理
      • 2.1 創建存儲桶
      • 2.2 刪除存儲桶
      • 2.3 列出存儲桶
      • 2.4 查看存儲桶策略
      • 2.5 設置存儲桶策略
    • 3. 對象管理
      • 3.1 上傳文件
      • 3.2 下載文件
      • 3.3 列出對象
      • 3.4 刪除對象
      • 3.5 批量刪除對象
    • 4. 高級功能
      • 4.1 同步數據
      • 4.2 數據遷移
      • 4.3 設置生命周期規則
      • 4.4 查看服務器信息
      • 4.5 用戶管理
      • 4.6 策略管理
    • 5. 常用快捷命令
  • 五. Spring Boot 集成 MinIO
    • 1 添加依賴
    • 2.在SpringBoot的配置文件中編寫 MinIO 的配置:
    • 3.編寫 MinIO 配置類
    • 4.編寫 MinIO 的工具類
    • 5.業務測試
  • 六. 常見問題

一. MinIO 簡介

1. 什么是MinIO?

MinlO是一個基于Apache License v2.0開源協議的對象存儲服務。它兼容亞馬遜S3云存儲服務接口,非常適合于存儲大容量非結構化的數據。例如圖片、視頻、日志文件、備份數據和容器/虛擬機鏡像等,而一個對象文件可以是任意大小,從幾kb到最大5T不等。

MinlO是一個非常輕量的服務 可以很簡單的和其他應用的結合,類似NodeJS, Redis或者MySQL。

MInIO官網

  • 核心特性
    • 支持海量非結構化數據(圖片、視頻、日志等)支持單個對象最大5TB。
    • 輕量級(二進制文件僅數十MB)。
    • 支持單機部署和分布式集群。
    • 提供數據加密、版本控制、生命周期管理等企業級功能。

2. 應用場景

  • 云原生存儲(Kubernetes 集成)。
  • 大數據存儲(與 Hadoop、Spark 對接)。
  • 多媒體資源存儲與加速。

二. 文件系統存儲發展史

1. 服務器磁盤(本地存儲)

定義

  • 直接掛載在服務器上的物理或虛擬磁盤(如 SSD、HDD),通過文件系統(如 ext4、NTFS)管理數據。

優點

  • 低延遲:數據直接讀寫,無需網絡開銷。
  • 高性能:適合頻繁讀寫、小文件操作(如數據庫事務)。
  • 簡單易用:無需復雜配置,開箱即用。

缺點

  • 單點故障:硬盤損壞可能導致數據丟失。
  • 擴展性差:受限于單機容量,無法橫向擴展。
  • 資源共享困難:數據無法跨服務器直接訪問。

適用場景

  • 單機應用(如小型網站、個人博客)。
  • 高性能需求場景(如實時數據庫、緩存服務)。
  • 臨時文件存儲(如日志、臨時緩存)。

2. 分布式文件系統(如 HDFS、Ceph、GlusterFS)

定義

  • 通過網絡將多臺服務器的存儲資源整合為統一命名空間,提供文件存儲和共享能力(如 HDFS、Ceph、GlusterFS)。
  • 它使文件可以跨越多個服務器或存儲設備存儲和訪問。DFS 通過網絡將多個存儲資源組合成一個統一的文件系統,使用戶和應用程序可以像訪問本地文件一樣透明地訪問遠程文件。

優點

  • 橫向擴展:可動態添加節點,支持 PB 級存儲。
  • 高可用性:數據多副本或糾刪碼冗余,容忍節點故障。
  • 共享訪問:多客戶端可同時讀寫同一文件系統。

缺點

  • 復雜度高:需管理元數據、數據分布和一致性。
  • 性能瓶頸:元數據操作(如 HDFS 的 NameNode)可能成為瓶頸。
  • 成本較高:需維護多節點集群,硬件和運維成本上升。

適用場景

  • 大數據處理(如 Hadoop 生態、日志分析)。
  • 需要共享存儲的場景(如 Kubernetes 動態卷、虛擬機鏡像存儲)。
  • 高吞吐需求(如視頻流媒體、科學計算)。

3. 對象存儲(如 MinIO、AWS S3)

定義

  • 以對象(Object)為基本單元的存儲系統,每個對象包含數據、元數據和唯一標識符(如 S3 的 Key),通過 RESTful API 訪問。

優點

  • 海量擴展:支持百億級對象存儲,自動管理數據分布。
  • 高可用與持久性:數據跨多節點冗余(如 MinIO 的糾刪碼)。
  • 云原生集成:兼容 S3 API,無縫對接云服務和工具鏈。
  • 成本效益:按需付費,支持冷熱數據分層存儲。

缺點

  • 高延遲:基于 HTTP 協議,不適合實時讀寫。
  • 弱一致性:部分系統存在最終一致性(如 S3 的跨區域復制)。
  • 文件系統語義缺失:不支持隨機寫入、追加操作。

適用場景

  • 非結構化數據存儲(如圖片、視頻、文檔)。
  • 云原生應用(如 Kubernetes 靜態資源托管)。
  • 大數據與 AI 數據湖(如 Spark 讀取 Parquet 文件)。
  • 備份與歸檔(如日志存儲、合規性歸檔)。

4.對比總結

特性服務器磁盤分布式文件系統對象存儲
數據模型層級文件系統層級文件系統平坦對象(Bucket/Object)
擴展性有限(單機)橫向擴展(多節點)海量擴展(自動管理)
訪問協議本地文件系統 APINFS/CIFS 或專用協議RESTful API(S3 兼容)
延遲極低中等(受網絡影響)較高(HTTP 開銷)
適用數據結構化、小文件大文件、流式數據非結構化、海量數據
維護成本高(需管理集群)中等(云服務免運維)

5.選型建議

  1. 優先選擇對象存儲

    • 云原生應用或需要彈性擴展的場景。
    • 存儲海量非結構化數據(如用戶上傳文件)。
    • 需要跨地域數據同步或版本控制。
  2. 選擇分布式文件系統

    • 大數據處理(如 HDFS 與 MapReduce 結合)。
    • 需要共享文件系統語義(如多個 VM 掛載同一目錄)。
  3. 保留本地存儲

    • 對延遲敏感的應用(如實時數據庫)。
    • 小規模或臨時性存儲需求。

6.示例方案

  • 混合方案

    • 使用本地存儲處理熱數據(如 Redis 緩存),對象存儲存放冷數據(如歷史日志)。
    • 分布式文件系統(如 Ceph)作為底層存儲,提供塊存儲、文件存儲和對象存儲統一接口。
  • 云原生方案

    • Kubernetes 中使用 MinIO 作為持久化存儲后端,結合 S3 API 實現無狀態應用的數據持久化。

通過合理選擇存儲方案,可顯著提升系統性能、降低成本并保障數據可靠性。

特性傳統分布式文件系統MinIO
數據模型層級目錄結構平坦命名空間(Bucket/Object)
接口專用協議(如 NFS)S3 兼容 REST API
擴展性需手動配置自動數據分布與負載均衡
適用場景通用存儲云原生、大數據、AI 數據湖

三.MinIO基礎概念

MinIO的基礎概念

● Object: 存儲到Minio的基本對象,如文件、字節流,Anything…

● Bucket:用來存儲Object的邏輯空間。每個Bucket之間的數據是相互隔離的。對于客戶端而言,就相當于一個存放文件的頂層文件夾。

● Drive: 即存儲數據的磁盤,在MinIO啟動時,以參數的方式傳入。Minio 中所有的對象數據都會存儲在Drive里。

● Set:即一組Drive的集合,分布式部署根據集群規模自動劃分一 個或多個Set, 每個Set中的Drive分布在不同位置。一個對象存儲在一個Set 上。(For example: {1…44} is divided into 4 sets each of size 16.)

● 一個對象存儲在一 個Set上● 一個集群劃分為多個Set● 一個Set包含的Drive數顯是固定的,默認由系統根據集群規模自動計算得出● 一個SET中的Drive盡可能分布在不同的節點上

MinIO 糾刪碼 EC (Erasure Code)

糾刪碼(Erasure Code, EC) 是一種數據保護方法,它將數據分割成片段,生成冗余數據塊,并將這些數據塊存儲在不同的位置,如磁盤、存儲節點或其他地理位置。MinIO 采用 Reed-Solomon 糾刪碼實現,將對象拆分成數據塊和奇偶校驗塊,以提高數據的冗余性和可用性。

簡單來說就是可以通過數學計算,把丟失的數據進行還原,它可以將n份原始數據,增加m份數據,并能通過n+m份中的任意n份數據,還原為原始數據。
即如果有任意小于等于m份的數據失效,仍然能通過剩下的數據還原出來。

舉個最簡單例子就是有兩個數據(d1, d2),用一個校驗和y(d1 + d2 = y)即可保證即使丟失其中一個,依然可以還原數據。如丟失 d1 ,則使用 y - d2 = d1 還原,同理,d2 丟失或者y丟失,均可通過計算得出。

三. MinIO 安裝指南

1 單機部署

# 下載并運行(Linux/macOS)
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
./minio server /data --console-address :9001
  • 訪問管理界面:http://localhost:9001

2 分布式集群部署

# 啟動4節點集群(假設4臺服務器IP為192.168.1.101-104)
minio server http://192.168.1.10{1...4}/data
  • 自動數據冗余:采用糾刪碼(Erasure Code)保障數據可靠性。

3 Docker 部署

docker run -p 9000:9000 -p 9001:9001 \-v /data:/data \-e "MINIO_ROOT_USER=admin" \-e "MINIO_ROOT_PASSWORD=password" \minio/minio server /data --console-address :9001

四. MinIO 基礎使用

1. 基礎命令

1.1 安裝與配置

  • 安裝 mc

    wget https://dl.min.io/client/mc/release/linux-amd64/mc
    chmod +x mc
    sudo mv mc /usr/local/bin/
    
  • 設置別名(連接 MinIO 服務):

    mc alias set <ALIAS> <ENDPOINT> <ACCESS_KEY> <SECRET_KEY>
    
    • 示例:

      mc alias set myminio http://localhost:9000 admin password
      
  • 查看別名列表

    mc alias list
    

2. 存儲桶管理

2.1 創建存儲桶

mc mb <ALIAS>/<BUCKET_NAME>
  • 示例:

    mc mb myminio/mybucket
    

2.2 刪除存儲桶

mc rb <ALIAS>/<BUCKET_NAME>
  • 示例:

    mc rb myminio/mybucket
    

2.3 列出存儲桶

mc ls <ALIAS>
  • 示例:

    mc ls myminio
    

2.4 查看存儲桶策略

mc policy get <ALIAS>/<BUCKET_NAME>
  • 示例:

    mc policy get myminio/mybucket
    

2.5 設置存儲桶策略

mc policy set <POLICY> <ALIAS>/<BUCKET_NAME>
  • 策略選項:none(私有)、download(只讀)、upload(上傳)、public(公開)。

  • 示例:

    mc policy set public myminio/mybucket
    

3. 對象管理

3.1 上傳文件

mc cp <SOURCE_FILE> <ALIAS>/<BUCKET_NAME>/<TARGET_PATH>
  • 示例:

    mc cp myfile.txt myminio/mybucket/
    

3.2 下載文件

mc cp <ALIAS>/<BUCKET_NAME>/<OBJECT_PATH> <DESTINATION>
  • 示例:

    mc cp myminio/mybucket/myfile.txt ./downloaded_file.txt
    

3.3 列出對象

mc ls <ALIAS>/<BUCKET_NAME>
  • 示例:

    mc ls myminio/mybucket
    

3.4 刪除對象

mc rm <ALIAS>/<BUCKET_NAME>/<OBJECT_PATH>
  • 示例:

    mc rm myminio/mybucket/myfile.txt
    

3.5 批量刪除對象

mc rm --recursive --force <ALIAS>/<BUCKET_NAME>/<PREFIX>
  • 示例:

    mc rm --recursive --force myminio/mybucket/old_data/
    

4. 高級功能

4.1 同步數據

  • 本地到遠程同步

    mc mirror <LOCAL_DIR> <ALIAS>/<BUCKET_NAME>
    
    • 示例:

      mc mirror ./local_data/ myminio/mybucket/
      
  • 遠程到本地同步

    mc mirror <ALIAS>/<BUCKET_NAME> <LOCAL_DIR>
    

4.2 數據遷移

  • 從其他 S3 兼容存儲遷移到 MinIO

    mc mirror s3-source/ myminio/mybucket/
    

4.3 設置生命周期規則

mc ilm add <ALIAS>/<BUCKET_NAME> --expiry-days <DAYS>
  • 示例:

    mc ilm add myminio/mybucket --expiry-days 30
    

4.4 查看服務器信息

mc admin info <ALIAS>
  • 示例:

    mc admin info myminio
    

4.5 用戶管理

  • 添加用戶

    mc admin user add <ALIAS> <ACCESS_KEY> <SECRET_KEY>
    
    • 示例:

      mc admin user add myminio newuser newpassword
      
  • 刪除用戶

    mc admin user remove <ALIAS> <ACCESS_KEY>
    

4.6 策略管理

  • 創建策略

    mc admin policy create <ALIAS> <POLICY_NAME> <POLICY_FILE>
    
    • 示例:

      mc admin policy create myminio readonly-policy policy.json
      
  • 綁定策略到用戶

    mc admin policy attach <ALIAS> <POLICY_NAME> --user=<USER>
    

5. 常用快捷命令

功能命令
查看幫助mc --help
查看某個命令的幫助mc <COMMAND> --help
檢查配置是否正確mc alias test <ALIAS>
清空存儲桶mc rb --force <ALIAS>/<BUCKET_NAME>
查看存儲桶占用空間mc du <ALIAS>/<BUCKET_NAME>

五. Spring Boot 集成 MinIO

1 添加依賴

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</version>
</dependency>

2.在SpringBoot的配置文件中編寫 MinIO 的配置:

minio:url: http://127.0.0.1:9005 #ip地址accessKey: admin #  賬號secretKey: admin962464 #  密碼secure: false #如果是true,則用的是https而不是http,默認值是truebucketName: "test"  # 桶的名字 相當于文件夾

3.編寫 MinIO 配置類

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;@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {/*** 服務地址*/private String url;/*** 用戶名*/private String accessKey;/*** 密碼*/private String secretKey;/*** 存儲桶名稱*/private String bucketName;@Beanpublic MinioClient getMinioClient() {return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();}
}

4.編寫 MinIO 的工具類

import com.jjy.shopping_file_service.config.MinioConfig;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;@Slf4j
@Component
public class MinIOUtil {@Resourceprivate MinioConfig minioConfig;@Resourceprivate MinioClient minioClient;/*** 查看存儲bucket是否存在** @param bucketName 存儲桶名稱* @return boolean*/public Boolean bucketExists(String bucketName) {Boolean found;try {found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());} catch (Exception e) {e.printStackTrace();return false;}return found;}/*** 創建存儲bucket** @param bucketName 存儲桶名稱* @return Boolean*/public Boolean makeBucket(String bucketName) {try {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 刪除存儲bucket** @param bucketName 存儲桶名稱* @return Boolean*/public Boolean removeBucket(String bucketName) {try {minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());} catch (Exception e) {e.printStackTrace();return false;}return true;}/*** 獲取全部bucket** @return 存儲桶列表*/public List<Bucket> getAllBuckets() {try {return minioClient.listBuckets();} catch (Exception e) {e.printStackTrace();}return null;}/*** 文件上傳** @param file 文件* @return 文件對象名稱*/public String upload(MultipartFile file) {String originalFilename = file.getOriginalFilename();System.out.println(originalFilename);if (!StringUtils.hasText(originalFilename)) {throw new RuntimeException();}String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));String prefix = new SimpleDateFormat("yyyy/MM/dd").format(new Date());String objectName = prefix + "/" + fileName;try {PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(minioConfig.getBucketName()).object(objectName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();// 文件名稱相同會覆蓋minioClient.putObject(objectArgs);} catch (Exception e) {e.printStackTrace();return null;}return objectName;}/*** 預覽圖片** @param fileName 文件名稱* @return 文件預覽鏈接*/public String preview(String fileName) {// 查看文件地址GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs.builder().bucket(minioConfig.getBucketName()).object(fileName).method(Method.GET).build();try {String url = minioClient.getPresignedObjectUrl(build);return url;} catch (Exception e) {e.printStackTrace();}return null;}/*** 文件下載** @param fileName 文件名稱* @param res      response*/public void download(String fileName, HttpServletResponse res) {GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileName).build();try (GetObjectResponse response = minioClient.getObject(objectArgs)) {byte[] buf = new byte[1024];int len;try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()) {while ((len = response.read(buf)) != -1) {os.write(buf, 0, len);}os.flush();byte[] bytes = os.toByteArray();res.setCharacterEncoding("utf-8");res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);try (ServletOutputStream stream = res.getOutputStream()) {stream.write(bytes);stream.flush();}}} catch (Exception e) {e.printStackTrace();}}/*** 查看文件對象** @return 存儲bucket內文件對象信息*/public List<Item> listObjects() {Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(minioConfig.getBucketName()).build());List<Item> items = new ArrayList<>();try {for (Result<Item> result : results) {items.add(result.get());}} catch (Exception e) {e.printStackTrace();return null;}return items;}/*** 刪除** @param fileName 文件名稱* @return 是否刪除成功*/public boolean remove(String fileName) {try {minioClient.removeObject(RemoveObjectArgs.builder().bucket(minioConfig.getBucketName()).object(fileName).build());} catch (Exception e) {return false;}return true;}}

5.業務測試

import com.cyw.miniodemo.config.MinioConfig;
import com.cyw.miniodemo.pojo.Rst;
import com.cyw.miniodemo.service.FileUploadService;
import com.cyw.miniodemo.utils.MinIOUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;@Slf4j
@RestController
@RequestMapping("/api/file")
@AllArgsConstructor
public class FileUploadController {private MinioConfig minioConfig;private MinIOUtil minIOUtil;private FileUploadService fileUploadService;@GetMapping("/bucketExists")public Rst bucketExists(@RequestParam("bucketName") String bucketName) {Map<String, Object> map = new HashMap<>();map.put("bucketExists", minIOUtil.bucketExists(bucketName));return Rst.ok("查詢成功", map);}@GetMapping("/makeBucket")public Rst makeBucket(@RequestParam("bucketName") String bucketName) {Map<String, Object> map = new HashMap<>();map.put("makeBucketSuccess", minIOUtil.makeBucket(bucketName));return Rst.ok("創建成功", map);}@GetMapping("/removeBucket")public Rst removeBucket(@RequestParam("bucketName") String bucketName) {Map<String, Object> map = new HashMap<>();map.put("deleteBucketSuccess", minIOUtil.removeBucket(bucketName));return Rst.ok("刪除成功", map);}@GetMapping("/getAllBuckets")public Rst getAllBuckets() {Map<String, Object> map = new HashMap<>();map.put("buckets", minIOUtil.getAllBuckets());return Rst.ok("查詢成功", map);}@PostMapping("/upload")public Rst upload(@RequestParam("file") MultipartFile file) {String objectName = minIOUtil.upload(file);if (objectName != null) {Map<String, Object> map = new HashMap<>();map.put("url", (minioConfig.getEndpoint() + "/" + minioConfig.getBucketName() + "/" + objectName));return Rst.ok("上傳成功", map);}return Rst.fail("上傳失敗");}@GetMapping("/preview")public Rst preview(@RequestParam("fileName") String fileName) {Map<String, Object> map = new HashMap<>();map.put("url", minIOUtil.preview(fileName));return Rst.ok("預覽成功", map);}@GetMapping("/download")public Rst download(@RequestParam("fileName") String fileName, HttpServletResponse resp) {minIOUtil.download(fileName, resp);return Rst.ok();}@PostMapping("/delete")public Rst remove(@RequestBody Map<String, String> params) {String url = params.get("url");String objName = url.substring(url.lastIndexOf(minioConfig.getBucketName() + "/") + minioConfig.getBucketName().length() + 1);log.info("刪除對象: {}", objName);minIOUtil.remove(objName);return Rst.ok("刪除成功");}
}

六. 常見問題

  • 如何擴容集群?:直接添加新節點,MinIO 自動數據再平衡。
  • 數據安全性:啟用 HTTPS、配置 Bucket Policy、使用 Server-Side Encryption。
  • 性能優化:調整糾刪碼配置(如 MINIO_STORAGE_CLASS_STANDARD=EC:4)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78386.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78386.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78386.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電競俱樂部護航點單小程序,和平地鐵俱樂部點單系統,三角洲護航小程序,暗區突圍俱樂部小程序

電競俱樂部護航點單小程序開發&#xff0c;和平地鐵俱樂部點單系統&#xff0c;三角洲護航小程序&#xff0c;暗區突圍俱樂部小程序開發 端口包含&#xff1a; 超管后臺&#xff0c; 老板端&#xff0c;打手端&#xff0c;商家端&#xff0c;客服端&#xff0c;管事端&#x…

基于 IPMI + Kickstart + Jenkins 的 OS 自動化安裝

Author&#xff1a;Arsen Date&#xff1a;2025/04/26 目錄 環境要求實現步驟自定義 ISO安裝 ipmitool安裝 NFS定義 ks.cfg安裝 HTTP編寫 Pipeline 功能驗證 環境要求 目標服務器支持 IPMI / Redfish 遠程管理&#xff08;如 DELL iDRAC、HPE iLO、華為 iBMC&#xff09;&…

如何在SpringBoot中通過@Value注入Map和List并使用YAML配置?

在SpringBoot開發中&#xff0c;我們經常需要從配置文件中讀取各種參數。對于簡單的字符串或數值&#xff0c;直接使用Value注解就可以了。但當我們需要注入更復雜的數據結構&#xff0c;比如Map或者List時&#xff0c;該怎么操作呢&#xff1f;特別是使用YAML這種更人性化的配…

短信驗證碼安全實戰:三網API+多語言適配開發指南

在短信服務中&#xff0c;創建自定義簽名是發送通知、驗證信息和其他類型消息的重要步驟。萬維易源提供的“三網短信驗證碼”API為開發者和企業提供了高效、便捷的自定義簽名創建服務&#xff0c;可以通過簡單的接口調用提交簽名給運營商審核。本文將詳細介紹如何使用該API&…

RabbitMQ和Seata沖突嗎?Seata與Spring中的事務管理沖突嗎

1. GlobalTransactional 和 Transactional 是否沖突&#xff1f; 答&#xff1a;不沖突&#xff0c;它們可以協同工作&#xff0c;但作用域不同。 Transactional: 這是 Spring 提供的注解&#xff0c;用于管理單個數據源內的本地事務。在你當前的 register 方法中&#xff0c…

一臺服務器已經有個python3.11版本了,如何手動安裝 Python 3.10,兩個版本共存

環境&#xff1a; debian12.8 python3.11 python3.10 問題描述&#xff1a; 一臺服務器已經有個python3.11版本了&#xff0c;如何手動安裝 Python 3.10&#xff0c;兩個版本共存 解決方案&#xff1a; 1.下載 Python 3.10 源碼&#xff1a; wget https://www.python.or…

c++中的enum變量 和 constexpr說明符

author: hjjdebug date: 2025年 04月 23日 星期三 13:40:21 CST description: c中的enum變量 和 constexpr說明符 文章目錄 1.Q:enum 類型變量可以有,--操作嗎&#xff1f;1.1補充: c/c中enum的另一個細微差別. 2.Q: constexpr 修飾的函數,要求傳入的參數必需是常量嗎&#xff…

postman工具

postman工具 進入postman官網 www.postman.com/downloads/ https://www.postman.com/downloads/ https://www.postman.com/postman/published-postman-templates/documentation/ae2ja6x/postman-echo?ctxdocumentation Postman Echo is a service you can use to test your …

Spring和Spring Boot集成MyBatis的完整對比示例,包含從項目創建到測試的全流程代碼

以下是Spring和Spring Boot集成MyBatis的完整對比示例&#xff0c;包含從項目創建到測試的全流程代碼&#xff1a; 一、Spring集成MyBatis示例 1. 項目結構 spring-mybatis-demo/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com.example/…

【數據可視化-24】巧克力銷售數據的多維度可視化分析

?? 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN人工智能領域的優質創作者,提供AI相關的技術咨詢、項目開發和個…

c語言-分支結構

以下是我初學C語言的筆記記錄&#xff0c;歡迎留言補充 一&#xff0c;分支結構分為幾個 兩個&#xff0c;一個是if語句&#xff0c;一個是Switch語句 二&#xff0c;if語句 &#xff08;1&#xff09;結構體 int main() {if()//判斷條件{//表達式}else if()//判斷條件{//表達式…

數據庫MySQL學習——day4(更多查詢操作與更新數據)

文章目錄 1、聚合函數&#xff08;Aggregate Functions&#xff09;2、分組查詢&#xff08;GROUP BY&#xff09;3、更新數據&#xff08;UPDATE&#xff09;4、刪除數據&#xff08;DELETE&#xff09;5、進階練習示例6、 今日小結 1、聚合函數&#xff08;Aggregate Functio…

Spark-SQL 項目

一、項目概述 &#xff08;一&#xff09;實驗目標 統計有效數據條數&#xff1a;篩選出uid、phone、addr三個字段均無空值的記錄并計數。提取用戶數量最多的前 20 個地址&#xff1a;按地址分組統計用戶數&#xff0c;按降序排序后取前 20 名。 &#xff08;二&#xff09;…

Redis的ZSet對象底層原理——跳表

我們來聊聊「跳表&#xff08;Skip List&#xff09;」&#xff0c;這是一個既經典又優雅的數據結構&#xff0c;尤其在 Redis 中非常重要&#xff0c;比如 ZSet&#xff08;有序集合&#xff09;底層就用到了跳表。 &#x1f31f; 跳表&#xff08;Skip List&#xff09;簡介 …

2025深圳中興通訊安卓開發社招面經

2月27號 中興通訊一面 30多分鐘 自我介紹 聊項目 我的優缺點&#xff0c;跟同事相比&#xff0c;有什么突出的地方 Handler機制&#xff0c;如何判斷是哪個消息比較耗時 設計模式&#xff1a;模板模式 線程的狀態 線程的開啟方式 線程池原理 活動的啟動模式 Service和Activity…

【Castle-X機器人】二、智能導覽模塊安裝與調試

持續更新。。。。。。。。。。。。。。。 【Castle-X機器人】智能導覽模塊安裝與調試 二、智能導覽模塊安裝與調試2.1 智能導覽模塊安裝2.2 智能導覽模塊調試2.2.1 紅外測溫傳感器測試2.2.2 2D攝像頭測試 二、智能導覽模塊安裝與調試 2.1 智能導覽模塊安裝 使用相應工具將智能…

深入理解二叉樹遍歷:遞歸與棧的雙重視角

二叉樹的遍歷前序遍歷中序遍歷后續遍歷總結 二叉樹的遍歷 雖然用遞歸的方法遍歷二叉樹實現起來更簡單&#xff0c;但是要想深入理解二叉樹的遍歷&#xff0c;我們還必須要掌握用棧遍歷二叉樹&#xff0c;遞歸其實就是利用了系統棧去遍歷。特此記錄一下如何用雙重視角去看待二叉…

Qt Creator中自定義應用程序的可執行文件圖標

要在Qt Creator中為你的應用程序設置自定義可執行文件圖標&#xff0c;你需要按照以下步驟操作&#xff1a; Windows平臺設置方法 準備圖標文件&#xff1a; 創建一個.ico格式的圖標文件&#xff08;推薦使用256x256像素&#xff0c;包含多種尺寸&#xff09; 可以使用在線工…

Windows11系統中GIT下載

Windows11系統中GIT下載 0、GIT背景介紹0.0 GIT概述0.1 GIT誕生背景0.2 Linus Torvalds 的設計目標0.3 Git 的誕生&#xff08;2005 年&#xff09;0.4 Git 的后續發展0.5 為什么 Git 能成功&#xff1f; 1、資源下載地址1.1 官網資源1.2 站內資源 2、安裝指導3、驗證是否下載完…

react的fiber 用法

在 React 里&#xff0c;Fiber 是 React 16.x 及后續版本采用的協調算法&#xff0c;它把渲染工作分割成多個小任務&#xff0c;讓 React 可以在渲染過程中暫停、恢復和復用任務&#xff0c;以此提升渲染性能與響應能力。在實際開發中&#xff0c;你無需直接操作 Fiber 節點&am…