存储系统
一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统
特点有
- 作为后端软件的底座.性能敏感
- 存储系统软件架构,容易受硬件影响
- 存储系统代码,既“简单"又“复杂”
数据库
关系型数据库和非关系型数据库
关系=集合=任意元素组成的若干有序偶对反应了事物间的关系
相关文章
关系代数=对关系作运算的抽象查询语言
- 交、并、笛卡尔积…… SQL=一种DSL=方便人类阅读的关系代数表达形式
关系型
关系型数据库是存储系统,但是在存储之外,又发展出其他能力
- 结构化数据友好struct
- 支持事务acid
- 支持复杂语言SQL关系型数据库是指采用了关系模型来组织数据的数据库。简单来说,关系模式就是二维表格模型。
非关系型
NoSQL非关系型数据库,主要指那些非关系型的、分布式的,且一般不保证ACID的数据存储系统。
NoSQL提出了另一种理念,以键值来存储,且结构不稳定,每一个元组都可以有不一样的字段,这种就不会局限于固定的结构,可以减少一些时间和空间的开销。使用这种方式,为了获取用户的不同信息,不需要像关系型数据库中,需要进行多表查询。仅仅需要根据key来取出对应的value值即可。
主流存储分类
单机存储 | 单机数据库 | 分布式数据库 | 分布式存储 |
文件系统 | 关系型数据 | 关系型数据 | 分布式文件系 |
Key-Value存 | 非关系型数据 | 非关系型数据库 | 对象存储 |
1.单机存储
单个计算机节点上的存储软件系统,一般不涉及网络交互
特点
- 本地文件系统
- key-value存储
2.分布式存储—概览
在单机存储基础上实现了分布式协议,涉及大量网络交互
HDFS、Ceph
特点
- 分布式文件系统
- 分布式对象存储
3.单机数据库
单个计算机节点上的数据库系统
事务在单机内执行,也可能通过网络交互实现分布式事务
关系型数据库
商业产品Oracle,开源产品MySQL & PostgreSQL
非关系型数据库
MongoDB、Redis、Elasticsearch
关系型数据库一般直接使用SQL交互,而非关系型数据库交互方式各不相同
非关系型数据库的数据结构千奇百怪,没有关系约束后,schema相对灵活
不管是否关系型数据库,大家都在尝试支持SQL(子集)和“事务”
4.分布式数据库
- 容量:单点容量有限,受硬件限制
- 弹性:扩容等问题
- 性能
- 性价比
在存储和数据库领域,硬件反推软件的变革十分常见
对象存储OSS(Object Storage Service)
特点
- 容量无限大:可以到 EB 级,多少数据都能存的下
- 持久可靠:11个 9 甚至以上的可靠性,数据丢失的概率比中五百万的概率还要低 2-3 个量级
- 低成本:1 部高清电影存 1 年,差不多也就几块钱人民币
- 使用方便:支持 REST 接口,主要操作为 PUT/GET/DELETE等,使用非常简单。
应用场景:日志、文本、音频、视频、图片、安装包、备份、前端js文件等
对象存储使用
对象(Object)是OSS存储数据的基本单元,也被称为OSS的文件。
和传统的文件系统不同,Object没有文件目录层级结构的关系。
- 创建Bucket
- 开发业务逻辑
- 测试
restful接口
对象存储对外提供的一般都是Restful风格的接口。
和gin类似
MultiUpload接口
解决大文件的问题
Listprefix接口
查看bucket里面的对象
关于运行代码
刚再阿里云上申请完,但是控制台里显示"数据还在准备中"
官网里面的文档非常详细了,不需要做任何补充
bucket创建就可以使用
OSS管理控制台 (aliyun.com)在这里可以看到endpoint当然是选择外网访问的第一个啦
在头像触摸可以出来accessKey管理,新建一个就可以使用。
分别是acessKey和acessSecretKey,在之后登录会用到
还有STS访客临时登录等等,文档里面很详细
在goland里面用
发现完全没必要自己写了啊,找到了阿里云的 OSS SDK for Go
- 执行命令
go get github.com/aliyun/aliyun-oss-go-sdk/oss
获取远程代码包。 - 在您的代码中使用
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
引入OSS Go SDK的包。
这样就应该可以在大项目里面用了
go
复制代码
package main import ( "fmt" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret") if err != nil { // HandleError(err) } lsRes, err := client.ListBuckets() if err != nil { // HandleError(err) } for _, bucket := range lsRes.Buckets { fmt.Println("Buckets:", bucket.Name) } bucket, err := client.Bucket("my-bucket") if err != nil { // HandleError(err) } lsRest, err := bucket.ListObjects() if err != nil { // HandleError(err) } for _, object := range lsRest.Objects { fmt.Println("Objects:", object.Key) } }