第六届字节跳动青训营第八课 | 青训营

86 阅读4分钟

第八节课之存储与数据库

数据案例

  1. 数据产生 小明同学下载了新的APP,因第一次登陆,他注册了一个账号。 相关的注册信息资料在按下“注册”按钮时便产生数据,数据实现从人流向机器的过程。

  2. 数据流动 一条用户注册数据可以写作如下格式。

    {
     "user_name": "小明",
     "password": "helloworld",
     "password_hint": "coding",
     // ...
    }
    

    该数据在注册后从终端流向后端服务器,并在需要时继续流向数据库及其它系统实现持久化。

  3. 数据持久化 数据在产生之后,必须要经过持久化才能得到妥善储存。倘若只存在后端服务器的内存之中,容易替换丢失或掉电丢失,这要求用户每次都需重新注册,也并不合理。 在数据持久化的过程中,需要先校验数据合法性,譬如检测“小明”的用户名是否已经存在。其次,则是修改内存,用高效的数据结构组织数据。最后则是写入存储介质,采用寿命和性能友好的方式写入硬件。

数据库与存储系统

存储系统

  1. 存储系统定义 一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统。它的接口需要涉及用户、介质、内存和网络。

  2. 存储系统特点 首先,它作为后端软件的底座,有性能敏感的特性。 其次,存储系统的代码既要求“简单”以使性能优化,又要求“复杂”保证功能完备运行稳定。 最后是存储系统的软件架构,容易受硬件影响,可能因硬件的变动优化而要修改软件架构。

  3. 存储器层级结构 存储器存在一个类似金字塔的结构,越往上价格越高、容量越小、性能越好、速度越快、越易掉电丢失。一般从上至下包括:

    • 处理器寄存器
    • 处理器缓存
    • RAM
    • 闪存
    • 硬盘驱动器
    • 磁带
  4. 从应用到存储介质 数据从应用到存储介质的过程,也是从金字塔顶向下传输数据的过程。 为了充分优化这一过程的性能,需要注意:

    • 缓存的概念很重要,它贯穿于整个存储体系,每一层都可以看作为其下一层的缓存。
    • 拷贝很昂贵,应该尽量减少这一操作。
    • 硬件设备五花八门,需要抽象出统一的接入层简化设计。
  5. RAID技术 RAID全称为“Redundant Array of Inexpensive Disks”。 它主张利用多块小磁盘替代大磁盘,实现高性能和高性价比;并引入冗余磁盘用作数据校验,以保证高可靠性。

数据库

  1. 关系 关系模型指的是任意元素组成的若干有序偶对,反应了事物间的关系。 在数学中对应了关系代数来表达,这是一种对关系做运算的抽象查询语言。 SQL语言则是方便人类阅读的关系代数表达形式。
  2. 关系型数据库 关系型数据库属于存储系统,但除了存储功能,它也发展了其他能力。
    • 结构化数据友好
    • 支持事务
    • 支持如SQL的复杂查询语言
  3. 非关系型数据库 非关系型数据库也是存储系统,但一般不要求严格的结构化。
    • 半结构化数据友好
    • 可能支持事务
    • 可能支持复杂查询语言

数据库与经典存储

  1. 结构化数据管理 数据在写入关系型数据库时,以表的形式管理。例如一条用户注册数据,在对应的数据表中插入一行(tuple),填入对应列的信息。 而在经典存储中,将数据写入文件,要自行定义管理结构,结构复杂不好管理。
  2. 事务能力 数据库支持事务,极大优化了其使用。 事务具有ACID的特性,分别为:
    • 原子性(Atomicity),事务内的操作要么不做,要么全做。
    • 一致性(Consistency),事务执行前后,数据库内数据状态一致。
    • 隔离性(Isolation),可以隔离多个并发事务,实现并发操作,避免并发导致的错误。
    • 持久性(Durability),事务一旦提交成功,数据保证持久性。
  3. 复杂查询能力 要进行复杂查询时,数据库可以很方便地支持以SQL为代表的复杂查询语言。SQL语言灵活、简洁且易读,方便用户使用。 而在经典存储系统中,要进行查询需要僵化复杂的代码,对用户不友好。