01-存储背景

数据存储是信息时代的一项基础技术,是各种互联网应用背后的重要基石。例如我们每天用到的各种APP,看头条,刷抖音,以及个人的各种电子数据的保存等等,都离不开存储技术。

在开发者的角度,数据存储大多是使用数据库,而大家广泛使用的又是比较成熟的关系型数据库,例如mysql、oracle、db2、sqlserver等。一直以来,关系型数据库得到大家的青睐。但随着互联网和信息技术的发展,以及各种新的应用场景的需求,各种数据库不断涌现,也出现了新的数据库类型,比如kv数据库、文档数据库、图数据库、时序数据库等等。

在db-engines上统计的目前数据库有数百个,以下是db-engines上目前排名靠前的数据库。

视频数据库的架构 存储视频的数据库_数据库

当然本书将要介绍的leveldb并未出现在这个前10榜单中。但它作为最近几年出现的数据库正成为后起之秀,越来越多地被开发者所熟悉和应用,并成为当前分布式数据库的核心引擎的主流之选。开源数据库ssdb就是将作leveldb作为存储引擎进行架构的。基于leveld开发的rocksdb更是被广泛地应用,目前国产数据库中风光无限的TiDB就是基于rocksdb开发。

02-leveldb背景

传统的关系型数据库平衡了读写的性能,使用B tree作为其索引存储结构,以其良好的稳定性被目前大多数应用和场景所使用。而对于一些写多读少、高并发、超大数据量的应用场景,使用B tree组织的关系型数据库难以堪此重任。因此以leveldb为代表的写优化的数据结构LSM tree应用而生。关于B tree和LSM tree后面章节会进行详细介绍,此处略过。

leveldb通过将磁盘随机写转换为顺序写来提高其写入性能。不论是数据的写入、删除还是更新,在leveldb中都是进行追加写的方式,从而保证了磁盘的顺序写。磁盘顺序写的性能较随机写至少要高1000倍。因此通过优化磁盘写入方式,显著提升了其写入性能。

03-leveldb简介

leveldb是谷歌开源的高效的kv数据库引擎,由Jeff Dean和Sanjay Ghemawat两位大神开发。在github上由两位的邮箱:Sanjay Ghemawat (sanjay@google.com) and Jeff Dean (jeff@google.com),如果您学习完leveldb之后有新的发现和建议,不防可以尝试和两位大神进行交流。

在github上的项目地址是:https://github.com/google/leveldb
开源协议为BSD,非常友好的开源协议,可以按照协议对源代码进行修改并重新发布,Facebook开源的Rockdb就是就是基于leveldb进行优化的。

介绍完作者和开源情况,接下来说说leveldb的特点:

  • leveldb是持久化存储的kv系统,不同于redis将数据全部存储在内存中,而是将大部分数据存储于磁盘上。
  • leveldb在存储数据时是根据key的顺序进行有序存储的,key的排序默认按字节序排序,支持用户自定义比较函数。
  • leveldb和其他kv数据库一样,提供put、get、delete及批量原子操作接口。当然还提供一个范围查询的迭代器。
  • leveldb支持数据快照功能,使得读取操作不受写入操作的影响,在读取过程中获得一致的数据。
  • leveldb支持数据压缩功能,使用特定的前缀压缩以及块压缩,大大减少磁盘空间的占用以及提高IO效率。
  • leveldb性能非常突出,官方报道其随机写性能达到40万每秒,而随机写性能达到6万每秒。
  • leveldb是一个数据库存储引擎,它可以作为嵌入式数据库使用,也可以自己封装网络层来实现自己的数据库服务。