大家好!我是一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
以下是正文!
对象存储是什么?
对象存储是一种数据存储方式,它将数据分割成不同的对象,并为每个对象分配一个唯一的标识符,用于访问和操作数据。这些对象被存储在多个服务器上,以确保数据的可靠性和可用性。对象存储适合存储大量数据,具有可扩展性、低成本和高安全性等特点。
这段话太专业了,以至于有点让人看不懂。私以为对象存储就是『分布式文件存储系统』,可能是我们只会用它来存储图片、视频、文档等文件吧😅,然后数据库(比如MySQL)只存储文件的访问链接。目前接触的对象存储有 阿里云对象存储OSS、天翼云对象存储融合版、自建对象存储MinIO。
- 阿里云对象存储OSS
- 天翼云对象存储融合版
- MinIO对象存储
这三款对象存储产品对比如下
产品 | 功能特点 | 是否收费 | 是否开源 | 对接难易度 |
---|---|---|---|---|
阿里云对象存储OSS | 阿里云OSS提供了丰富的存储、数据处理和分发功能,可以满足各种场景的需求 | 收费 | 不开源 | 只需要ak/sk,然后看文档即可 |
天翼云对象存储融合版 | 天翼云对象存储融合版主要面向移动互联网应用,提供了数据管理、在线处理等功能 | 收费 | 不开源 | 只需要ak/sk,然后看文档即可 |
MinIO对象存储 | MinIO专注于提供高性能、高可用的对象存储服务。 | 免费 | 开源 | 只需要ak/sk,然后看文档即可 |
总之有钱的话就买服务,没钱就自己搭,总有合适自己的😉。
对象存储和数据库的区别
各维度对比
存储 | 数据结构 | 数据处理 | 存储方式 | 可伸缩性 |
---|---|---|---|---|
数据库存储 | 数据库是基于表格的存储方式,每个表格有特定的列和行。 | 数据库主要用于存储结构化数据,如文本、数字和日期等。数据库可以进行更复杂的数据处理,如查询、过滤和排序等。 | 数据库通常使用关系型数据库或NoSQL数据库等 | 数据库在扩展性上需要更多的运维和管理 |
对象存储 | 对象存储是基于对象的存储方式,每个对象可以是任何类型的文件 | 对象存储通常用于存储大量非结构化数据,如图片、视频和音频等 | 对象存储通常使用分布式存储技术将数据分散存储在不同的节点上 | 对象存储具有良好的扩展性,因此可以轻松地添加新的节点来处理更多的数据 |
项目对接流程图对比
CRUD之阿里云对象存储
1. 安装Java SDK
一般都是通过maven直接引入
xml
复制代码
<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.15.1</version> </dependency>
2. 获取Client
官方获取Client代码示例
java
复制代码
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 String endpoint = "yourEndpoint"; // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 String accessKeyId = "yourAccessKeyId"; String accessKeySecret = "yourAccessKeySecret"; // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 关闭OSSClient。 ossClient.shutdown();
我一般会将其变成一个Component
java
复制代码
@Component public class AliyunOssClient { @Value("${oss.endpoint}") private String endpoint; @Value("${aliyun.accessKeyId}") private String accessKeyId; @Value("${aliyun.accessKeySecret}") private String accessKeySecret; @Bean(name = "aliyunOssClient") public OSS aliyunOssClient() { // 构建并返回OSSClient return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); } }
3. 增删改查操作
(1)对象公共读&上传和访问
java
复制代码
/** * 简单上传-流式上传-公共读 * * @param bucketName bucket名称 * @param key 文件名 * @param inputStream 输入流 * @return PutObjectResult 上传结果 */ public static PutObjectResult putObjectByInputStreamAndPublicRead(String bucketName, String key, InputStream inputStream) { ObjectMetadata metadata = new ObjectMetadata()