跳转至

概论

存储往往也是服务器程序必备的一个功能。例如,如果编写一个教务系统,那么就要存放学生的信息、课表、成绩等,而不能重启程序之后信息都丢失了。也许你已经知道如何使用文件操作函数来读取和写入文件,但是仅仅操作文件是不够的,我们还需要考虑许多情况:

  • 应该使用什么格式将数据保存到文件里?要考虑存取速度还是占用空间?
  • 程序升级之后,要怎么处理已经存在的数据?
  • 升级失败后,有没有办法恢复数据?
  • 如何处理多线程同时修改或读取数据?
  • 在读写数据时程序意外崩溃了,要如何恢复数据?
  • 要编写什么样的接口方便存取数据?

要处理以上各种各样复杂的情况,其实就是要编写一个存储引擎。当然,经过几十年的发展,网上已经有大量现成的存储引擎可以使用,我们只需要根据自己的需要去选择一个合适的存储引擎整合到服务器程序中即可。

根据存储引擎存放数据位置的不同,有本地存储和远程存储,本地存储约等于直接读写文件,延迟低,但是如果服务程序移动到其他机器上运行,则会丢失数据,远程存储则是利用 RPC 来向其他服务程序请求数据,将计算和存储分离,会带来更高的延迟以及更复杂的分布式通信问题,但是可以更好的容灾。

而根据提供的存储接口不同,又可以分为键值对(KV)存储、关系型数据库(RDBMS)、文档数据库(Document)、向量数据库(Vector)等。笼统地讲,其实就是存储系统本身对于数据类型有着多少了解,并且内嵌了各种程度的计算引擎。例如 KV 数据库对数据本身几乎没有任何了解,只是简单地提供一个字节数组到字节数组映射的存储系统,使用 KV 数据库的时候就需要编写大量代码来先从数据库取出 KV 对,然后再进行计算。而像 RDBMS 则可以理解为在 KV 数据库上,提供了复杂的计算引擎,可以使用 SQL 语句等,直接在存储系统完成需要的计算,再返回结果,使用者则不需要亲自处理 KV 的底层细节。而文档数据库也可以理解为带有一定计算功能的 KV 引擎,是 RDBMS 和 KV 数据库的一种折中,可以理解一个 Value 中的信息,比如可以将其理解成一个结构体。向量数据库则是顺应 AI 时代的一种新型数据库,它存储的是大量的浮点数向量,提供了例如 KNN 等经典的向量算法,可以在数据库端对向量进行计算。

使用功能强大的数据库,可以简化代码的编写,但是在灵活性上则不如功能简单的数据库。例如,当数据量快速增长时,KV 数据库扩容就会比 RDBMS 简单,性能调优也更简单。同时,功能复杂的数据库可能会带来许多额外的开销,在追求性能的时候优化起来会比使用简单版的数据库加自己编写的算法麻烦,所以也并不是一定要使用 RDBMS 等强大的数据库。

本节主要带你了解有什么样的存储模型可以选择,以及对应的使用场景,但是对于具体的存储引擎实现则不会详细说明,更重要的是学会分析不同引擎的优劣,以及是否适合自己的应用需求。


最后更新: 2021-08-31 21:49:58
本页作者: Howard Lau