笔记(三)认识存储与数据库 | 青训营笔记

134 阅读4分钟

后端青训营第三门课的笔记,通过一个模拟案例,描述数据是怎么产生,在后端系统里怎么流通,最后怎么写入到存储/数据库系统,以及存储/数据库系统的产生背景及基本特点。

1.经典案例 用户注册

数据的流动

一条结构化的用户注册数据—>后端服务器—>数据库,对必要的、需要记忆的数据做持久化。

链路末端,数据库后面可能还会跟一些其他的存储/非存储系统。

数据的持久化

要经过以下操作:

  1. 校验数据合法性,比如注册用户名是否已经存在
  2. 修改内存,用高效的数据结构组织数据
  3. 写入存储介质,以寿命&性能友好的方式写入硬件

潜在的问题

比如如何应对数据丢失、并发请求、处理非结构化数据。

存储系统

存储系统是指计算机中由存放程序和数据的各种存储设备、控制部件及管理信息调度的设备(硬件)和算法(软件)所组成的系统。要关注用户、介质、内存以及网络编程(单机->分布式)。

特点:

  • 性能敏感,追求高性能。
  • 容易受硬件影响
  • 代码既“简单”又“复杂”,前者出于大量并发操作的考虑从简,后者针对谨慎的异常检测处理需要复杂。

在数据从应用到存储介质的过程中,缓存很重要,对软件层/硬件层友好,贯穿整个存储体系;而拷贝需要使用CPU,很昂贵应该尽量减少。

RAID ( Redundant Array of Independent Disks )即独立磁盘冗余阵列,简称为「磁盘阵列」,其实就是用多个独立的磁盘组成在一起形成一个大的磁盘系统,从而实现比单块磁盘更好的存储性能和更高的可靠性。

数据库

关系型数据库

关系型数据库是存储系统,但是在存储之外发展出其他能力:

  • 结构化数据友好
  • 支持事务(ACID)
  • 支持复杂查询语言,比如SQL(不一定是标准全集,但至少是一个大的子集)

非关系型数据库

非关系型数据库是存储系统,但是一般不要求严格的结构化。

  • 半结构化数据友好
  • 可能支持事务(ACID)
  • 可能支持复杂查询语言

数据库 vs 经典存储

结构化数据管理

数据库:写入关系型数据库,以表形式管理。

经典存储:写入文件,需要自行定义管理结构(字段级)。

事务能力

数据库支持事务,具有优越性。

事务的特性,ACID:

  • 原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败。

  • 一致性(Consistency)

官网上事务一致性的概念是:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。 换一种方式理解就是:事务按照预期生效,数据的状态是预期的状态。

举例说明:张三向李四转100元,转账前和转账后的数据是正确的状态,这就叫一致性,如果出现张三转出100元,李四账号没有增加100元这就出现了数据错误,就没有达到一致性。

  • 隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

  • 持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

复杂查询能力

数据库支持复杂查询,经典存储对此并不友好。

数据库使用方式

领域特定语言domain-specific language (DSL)是一种旨在特定领域下的上下文的语言。SQL就是一种主流的DSL,能很方便的操作数据、修改数据定义。