MinIO学习笔记

MINIO干什么用的: AI数据基础设施的对象存储

在这里插入图片描述

  • 为人工智能系统提供数据支持,数据存储
  • 对象存储(Object Storage)是一种数据存储架构,它以对象为单位来处理、存储和检索数据,每个对象都包含了数据本身以及元数据
  • MinIO存储的元数据主要包括对象的描述信息,如用户(account)、存储桶(bucket)以及存储桶索引(bucket index)等;
  • 对象存储系统通常通过基于HTTP或HTTPS协议的API(应用程序编程接口)进行数据读写;

MINIO是使用go语言进行开发的。

MinIO具有双重许可:

  • 开源GNU AGPL v3;(完全免费)
  • 商业企业许可证;(收费)

在下载的时候就可以选择免费的AGPL许可。

在这里插入图片描述

MINIO的下载(LINUX版本):

wget https://dl.min.io/server/minio/release/linux-amd64/minio #下载
chmod +x minio #赋予可执行权限
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"  #MINIO服务启动
  • MINIO_ROOT_USER:指定MinIO的用户名;
  • MINIO_ROOT_PASSWORD:指定MinIO的密码;
  • /mnt/data:指定MinIO服务器用于存储数据的目录;
  • console-address ":9001" :指定MinIO控制台的监听地址和端口

使用Docker启动运行MinIO

  • 拉取镜像
docker pull minio/minio
  • 启动MinIO容器:
docker run -p 9000:9000 -p 9001:9001 minio/minio server /mnt/docker/data --console-address :9001

Springboot整合Minio

  1. 导入依赖
        <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.1</version></dependency>
  1. 编写config配置类
package com.example.springboot_demo.config;import io.minio.MinioClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MinIOConfig {@Beanpublic MinioClient minioClient(){return MinioClient.builder().endpoint("http://192.168.114.128:9000").credentials("minioadmin","minioadmin").build();}
}
  1. 编写service
package com.example.springboot_demo.service;import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;@Service
public class MinIOService {@Autowiredprivate MinioClient minioClient;public void testMinioClient(){System.out.println(minioClient);}
}
  1. 写测试代码
package com.example.springboot_demo;import com.example.springboot_demo.service.MinIOService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class SpringbootDemoApplicationTests {@AutowiredMinIOService minIOService;@Testvoid contextLoads() {minIOService.testMinioClient();}}
  1. 控制台输出
    在这里插入图片描述

过程中可能碰到的问题看这


MinIO中的Bucket、Object

  • Bucket是存储Object的逻辑空间,每个Bucket之间的数据是相互隔离的,对用户而言,相当于存放文件的顶层文件夹;
  • Object是存储到MinIO的基本对象,对用户而言,相当于文件;

MinIO是线程安全的

MinioClient的常用API:

  • bucketExists()
    用于检查指定的存储桶是否存在,返回布尔值,表示存储桶是否存在;
    @Autowiredprivate MinioClient minioClient;@Testvoid test01() throws Exception {boolean isBuketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("myfile").build());//判断myfile bucket是否存在System.out.println(isBuketExists);}
  • makeBucket()
    用于创建一个新的存储桶(bucket),需要指定存储桶的名称;
    @Autowiredprivate MinioClient minioClient;@Testvoid  test02() throws Exception{//创建一个myfile的bucketminioClient.makeBucket(MakeBucketArgs.builder().bucket("myfile").build());}

登录http://ip地址:9001可以看到新添加的myfile
在这里插入图片描述

  • listBuckets()
    用于列出用户有权访问的所有存储桶,返回存储桶的列表;
    @Autowiredprivate MinioClient minioClient;@Testvoid  test03() throws Exception{List<Bucket> bucketList = minioClient.listBuckets();bucketList.forEach(bucket -> {System.out.println(bucket.name()+"--"+bucket.creationDate());});}
  • removeBucket()
    用于删除一个已存在的存储桶(bucket),删除失败会抛出异常;
    @Autowiredprivate MinioClient minioClient;@Testvoid  test04() throws Exception{minioClient.removeBucket(RemoveBucketArgs.builder().bucket("myfile").build());}

MinioClient的常用API:

  • putObject()
    用于上传文件到指定的存储桶;
    @Autowiredprivate MinioClient minioClient;@Testvoid  test06() throws Exception{File file = new File("F:\\pic.jpg");minioClient.putObject(PutObjectArgs.builder().bucket("myfile").object("test.jpg").stream(new FileInputStream(file),file.length(),-1).build());//bucket("myfile"):存到哪个bucket//object("test.jpg):存储的名字//stream(new FileInputStream(file),file.length(),-1)//Few FileInputStream(file):输入流//file.length():输入流的长度//-1:开启缓冲区的大小,-1表示系统自己设定缓冲区大小}
  • statObject()
    用于检查指定的对象(文件)的状态;
    @Autowiredprivate MinioClient minioClient;@Testvoid  test07() throws Exception{StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket("myfile").object("test.jpg").build());System.out.println(statObjectResponse);}
  • getPresignedObjectUrl()
    用于生成一个对象(文件)的签名URL,以便可以通过HTTP访问;
    @Testvoid  test08() throws Exception{String objectUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket("myfile").object("test.jpg").method(Method.GET).build());System.out.println(objectUrl);}

输出:
192.168.114.129:9000/myfile/test.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-A……
若想通过192.168.114.129:9000/myfile/test.jpg访问文件,需要修改权限
.
方式一:在web管理后台修改;(访问策略修改为 public)
bucket->myfile->Summary->Access Policy->public
在这里插入图片描述
方式二:通过客户端API修改;

   @Testvoid  test02() throws Exception{minioClient.makeBucket(MakeBucketArgs.builder().bucket("myfile").build());String policyJsonString = " \"{\"Version\":\"2012-10-17\",\"Statement\\\":[{\\\"Sid\\\":\\\"PublicRead\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"AWS\\\":\\\"*\\\"},\\\"Action\\\":[\\\"s3:GetObject\\\"],\\\"Resource\\\":[\\\"arn:aws:s3:::\" + bucketName + \"/*\\\"]}]}\";";minioClient.setBucketPolicy(SetBucketPolicyArgs.builder().bucket("myfile").config(policyJsonString).build());}
  • getObject()
    用于从指定的存储桶中下载文件;
    @Testvoid  test09() throws Exception{GetObjectResponse getObjectResponse = minioClient.getObject(GetObjectArgs.builder().bucket("myfile").object("test.jpg").build());}
  • listObjects()
    用于列出指定存储桶中的所有对象(文件);
    @Testvoid  test010() throws Exception{Iterable<Result<Item>> listObjects = minioClient.listObjects(ListObjectsArgs.builder().bucket("myfile").build());listObjects.forEach(itemResult->{try {Item item = itemResult.get();System.out.println(item.objectName());} catch (Exception e) {e.printStackTrace();}});}
  • removeObject()
    用于删除指定存储桶中的对象,需要指定存储桶名称和对象键;
    @Testvoid  test011() throws Exception{minioClient.removeObject(RemoveObjectArgs.builder().bucket("myfile").object("test.jpg").build());}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ModuleSim 仿真找不到模块 module is not defined

提示如下&#xff1a; # vsim -t 1ps -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L cycloneive_ver -L rtl_work -L work -voptargs""acc"" pulse_generator_tb # Start time: 14:26:25 on May 10,2024 # ** Note: (…

开关电源功率测试方法:输入、输出功率测试步骤

在现代电子设备中&#xff0c;开关电源扮演着至关重要的角色&#xff0c;其效率和稳定性直接影响到整个系统的性能。因此&#xff0c;对开关电源进行功率测试成为了电源管理的重要环节。本文将详细介绍如何使用DC-DC电源模块测试系统对开关电源的输入输出功率进行准确测量&…

网络安全之OSPF进阶

该文针对OSPF进行一个全面的认识。建议了解OSPF的基础后进行本文的一个阅读能较好理解本文。 OSPF基础的内容请查看&#xff1a;网络安全之动态路由OSPF基础-CSDN博客 OSPF中更新方式中的触发更新30分钟的链路状态刷新。是因为其算法决定的&#xff0c;距离矢量型协议是边算边…

Python | Leetcode Python题解之第87题扰乱字符串

题目&#xff1a; 题解&#xff1a; class Solution:def isScramble(self, s1: str, s2: str) -> bool:cachedef dfs(i1: int, i2: int, length: int) -> bool:"""第一个字符串从 i1 开始&#xff0c;第二个字符串从 i2 开始&#xff0c;子串的长度为 le…

5.13号模拟前端面试10问

1.介绍箭头函数和普通函数的区别 箭头函数和普通函数在JavaScript中有一些重要的区别。以下是关于这些区别的详细解释&#xff1a; 语法结构上的差异&#xff1a; 箭头函数使用更简洁的语法&#xff0c;它不需要使用function关键字&#xff0c;而是使用一个箭头&#xff08;…

第三方组件element-ui

1、创建 选vue2 不要快照 vue2于vue3差异 vue2main。js import Vue from vue import App from ./App.vueVue.config.productionTip falsenew Vue({render: h > h(App), }).$mount(#app)vue3 main.js vue2不能有多个跟组件&#xff08;div&#xff09;

牛客网刷题 | BC82 乘法表

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 输出九九乘法表&am…

ASP.NET医药进销存系统

摘 要 目前&#xff0c;大中型城市的多数药品店已经实现了商品管理、客户管理、销售管理及销售管理等的信息化和网络化&#xff0c;提高了管理效率。但是&#xff0c;在大多数小药品店&#xff0c;药品店管理仍然以传统人工管理为主&#xff0c;特别是在药品的采购、销售、库…

污水设备远程监控

随着环保意识的日益增强&#xff0c;污水处理作为城市建设和环境保护的重要一环&#xff0c;越来越受到社会各界的关注。然而&#xff0c;传统的污水处理设备管理方式往往存在着效率低下、响应速度慢、维护成本高等问题。为了解决这些痛点&#xff0c;HiWoo Cloud平台凭借其强大…

【数据结构】栈和队列OJ面试题

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;由于C语言没有栈的接口&#xff0c;所以我们需要自己造一个“模子”。我们直接copy之前的实现的栈的接口就可以了&#xff08;可以看我之前的博客【数据结构】栈和队列-CSDN博客copy接口&#xff09;&…

BGP基础配置实验

BGP基础配置实验 一、实验拓扑 初始拓扑&#xff1a; 最终拓扑&#xff1a; 二、实验要求及分析 实验要求&#xff1a; 1&#xff0c;R1为AS 100区域&#xff1b;R2、R3、R4为AS 200区域且属于OSPF协议&#xff1b;R5为AS 300区域&#xff1b; 2&#xff0c;每个设备上都有…

全面监控:系统日志分析与记录

全面监控&#xff1a;系统日志记录 系统日志是记录计算机系统各种活动和事件的文件或数据库。它们包含了系统的运行状态、错误信息、警告、用户操作记录等。 系统管理员和软件开发人员经常使用系统日志来诊断问题、监视系统性能和跟踪用户活动。 日志记录通常包括时间戳、事…

I. Integer Reaction

Problem - I - Codeforces 看到最小值最大值&#xff0c;二分答案。 思路&#xff1a;每次二分时开两个集合&#xff0c;分别表示 0 0 0颜色和 1 1 1颜色。如果是 c c c颜色&#xff0c;先将值存入 c c c颜色&#xff0c;之后在 ! c !c !c颜色中找大于等于 m i d − a mid - a…

软件设计师笔记(三)-设计模式和算法设计

本文内容来自笔者学习zst 留下的笔记&#xff0c;都是零碎的要点&#xff0c;查缺补漏&#xff0c;希望大家都能通过&#xff0c;记得加上免费的关注&#xff01;谢谢&#xff01;本章主要以下午题出现形式为主&#xff01; 文章编辑于&#xff1a;2024-5-13 13:43:47 目录 1…

数据分离和混淆矩阵的学习

1.明确意义 通过训练集建立模型的意义是对新的数据进行准确的预测&#xff08;测试集的准度高才代表good fit&#xff09;&#xff1b; 2.评估流程 3.单单利用准确率accuracy进行模型评估的局限性 模型一&#xff1a;一共1000个数据&#xff08;分别为900个1和100个0&#x…

Adobe After Effects AE v24.3.0 解锁版 (视频合成及视频特效制作)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 解锁版 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 解锁版 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 解锁版 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 解锁版 (视…

AI网络爬虫:用kimichat自动批量提取网页内容

首先&#xff0c;在网页中按下F12键&#xff0c;查看定位网页元素&#xff1a; 然后在kimi中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个爬取网页内容的Python脚本&#xff0c;具体步骤如下&#xff1a; 在F盘新建一个Excel文件&#xff1a;提示词…

ubuntu 22.04 安装 RTX 4090 显卡驱动 GPU Driver(PyTorch准备)

文章目录 1. 参考文章2. 检查GPU是Nvidia3. 卸载已有驱动3.1. 命令删除3.2. 老驱动包 4. 官网下载驱动5. 运行5.1. 远程安装关闭交互界面5.2. 运行5.3. 打开交互界面 6. 检测与后续安装 1. 参考文章 https://blog.csdn.net/JineD/article/details/129432308 2. 检查GPU是Nvid…

Typescript 哲学 - ts模块使用最佳实践

ts的作用域 默认是全局&#xff08;global&#xff09;&#xff0c;这也是为什么在 两个ts文件声明同一个变量报错变量名冲突&#xff0c;解决方法是使某个文件以模块的形式存在&#xff08;文件顶层使用 export 、import &#xff09; In TypeScript, just as in ECMAScript 2…

【软考高项】四十六、项目管理科学计算之运筹学

1、线性规划问题 解题思路&#xff1a; 先把文字转化成图表 最快方式应该是把第一题的4个答案直接代入计算&#xff0c;很快得知X2时利润最大。 A0时&#xff0c;利润5*630 A2时&#xff0c;利润2*25*634 A4时&#xff0c;利润4*23*523 A6时&#xff0c;利润4*2(因为甲的…