这是我参与「第三届青训营 -后端场」笔记创作活动的第四篇笔记。
1.经典案例
1.1数据的产生
小呆鸟同学在手机下载了一个APP。因为第一次登录,所以进入APP的时候,需要注册一个新账号。 于是呆鸟同学填好资料,按下了【注册】按钮,就这样,数据从无到有就产生了,并且在数十、数百毫秒内向APP的后端服务器飞奔而去。
1.2数据流动
1.3数据的持久化
如果当用户注册后,数据写入到数据库,此时数据没有持久化,下次用户再次访问app的时候,仍然需要进行注册。所以需要把存在数据库内存中的数据进行持久化。
1.4潜在的问题
- 数据库怎么不保证
数据不丢。 - 数据库怎么处理
多人同时修改的问题。 - 为什么用数据库,除了数据库还能存到
别的存储系统吗。 - 数据库只能处理
结构化数据吗。 - 有哪些操作数据库的
方式,要用什么编程语言。
2.存储 & 数据库简介
2.1系统概述
- 存储系统:一个提供课读写、控制类接口,能够安全有效地把数据持久化的软件。 不仅跟内存,还需要跟网络打交道。
2.2存储系统的特点
- 作为后端软件的底座,
性能敏感 - 存储系统的代码
既简单又复杂简单:数据库在并发情况下需要很多io,代码要写的简单复杂:在io,路径的错误处理分支上,考虑多种情况(软件错误,硬件损坏)
- 存储系统软件架构,
容易受硬件影响- 硬件一旦变化,此时存储系统软件也会跟着变革
2.3数据怎么从应用到存储介质
从User Data到Disk中间会有很多buffer或者canche。
- 特点:
缓存很重要,贯穿整个存储体系拷贝很昂贵,应该尽量减少- 硬件设备多,需要有抽象
统一的接口 缓存
- 在内存中产生用户数据,要把它写进存储介质上,但是存储介质它的访问方式并不友好,并不是像你想访问的方式来进行访问,例如你在软件中设计的逻辑是写数据是512Byte写,但是存储介质只能1.5Byte读进来。
- 我们在软件层面上实现canche就很重要,他能够使得数据以硬件友好的方式访问。而且大部分软件也分层的,canche作用就是在跨软件层地方以友好的方式与其他层级软件或者硬件进行交互。
拷贝
- 从用户态到内核态,到硬件层,需要经历多次数据拷贝,而数据拷贝是消耗CPU。如果CPU都用作数据拷贝了,你的其他操作逻辑,就没办法使用CPU,你的软件就跑不起来。
2.4数据库
问题:难道数据库和存储系统不一样吗?
关系型数据库
关系
关系型数据库特点:关系型数据库是存储系统,但是在存储之外,又发展出其他能力。
- 结构化友好
- 支持事务(ACID)
- 支持复杂的查询语言
非关系型数据库
非关系型数据库特点:非关系型数据库也是存储系统,但是一般不要求严格的结构化。
- 半结构化数据友好
- 可能支持事务
- 可能支持复杂查询语言
数据库VS经典存储
3.主流产品剖析
3.1单击存储
单击存储 = 单个计算机节点上的存储软件系统,一般不涉及网络交互
单击存储分为:本地文件系统和Key-Value存储
本地文件系统
Key-Value存储
3.2分布式存储
分布式存储 = 在单击存储基础上实现了分布式协议,涉及大量网络交互
分布式存储分为 :分布式文件系统和分布式对象存储
3.3单击关系型数据库
单击数据库 = 单个计算机节点上的数据库系统
事务在单击内执行,也可以通过网络交互实现分布式系统
数据库分为:关系型数据库和非关系型数据库
page
左边是内存数据结构,右边是磁盘数据结构