因为自己对数据库比较感兴趣,所以听说LevelDB时间比较早,但因种种原因一直没有写过相关的文章。这段时间不忙,准备做一个系列相关的主题。
我们知道,现在主流的数据库有从关系型数据库逐渐往分布式数据库迁移的趋势,比如大名鼎鼎的TiDB和PolarDB。而TiDB底层存储引擎使用的是RocksDB,RocksDB则使用了LevelDB(这就是开源的力量,相互借鉴)。从这方面看,LevelDB的性能可见一斑。
本篇文章主要介绍LevelDB的一些特点和基础概念。LevelDB是LSM (Log Structured Merge)算法的实现。里面涉及大量关于文件系统读写技术的真实案例。我们可以从中收货很多重要信息。
当前官方的源码地址:C++版本,另外还有两个移植版本分别是GoLevelDB和JavaLevelDB。工程从结构和文件命名上基本保持了跟C++版本的一致。各位看官可以根据自己的喜好各取所需。不过建议还是从C++官方版本看起。有位老哥之前做过一版注释,不过可能是基于main主分支为母版,但是并不影响代码阅读。我使用当前版本为1.22。
我自己用的是Mac电脑,主要开发语言是Java。对于C++的使用,更倾向于使用centos系统。所以我平时都是自建虚拟机,然后通过VSCode插件Remote Development“远程”控制来完成项目编译和调试工作。
获取源代码:
git clone --recurse-submodules https://github.com/google/leveldb.git
构建:
mkdir -p build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .
注:编译完是没有out-shared,out-static这两个文件夹 。
头文件介绍:
leveldb 对外暴露的接口都在 include/*.h 中,用户不应该依赖任何其它目录下的头文件,这些内部 API 可能会在没有警告的情况下被改变。
- include/leveldb/db.h:主要的 DB 接口,从这开始。
- include/leveldb/options.h: 控制数据库的行为,也控制当个读和写的行为。
- include/leveldb/comparator.h: 比较函数的抽象。如果你只想对 key 逐字节比较,可以直接使用默认的比较器。如果你想要自定义排序(例如处理不同的字符编码、解码等),可以实现自己的比较器。
- include/leveldb/iterator.h:迭代数据的接口,你可以从一个 DB 对象获取到一个迭代器。