LevelDB源码剖析:如何设计一个高性能嵌入式数据库

0. 准备工作

执行以下命令将LevelDB项目克隆到本地:

1
git clone --recurse-submodules https://github.com/google/leveldb.git

LevelDB本身是一个Key-Value存储引擎,并没有提供main入口函数。为了方便调试,参考reading-source-code-of-leveldb-1.23中的做法。在项目根目录下,新建debug/leveldb_debug.cc文件:

debug/leveldb_debug.cc
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <string>

#include "leveldb/db.h"

using namespace std;

int main() {
  leveldb::DB* db;
  leveldb::Options options;

  options.create_if_missing = true;

  leveldb::Status status = leveldb::DB::Open(options, "./leveldb_test", &db);

  if (!status.ok()) {
    cerr << status.ToString() << endl;
  }

  leveldb::WriteOptions writeOptions;

  db->Put(writeOptions, "hello", "world");
  string value;
  db->Get(leveldb::ReadOptions(), "hello", &value);
  cout << "Keyword value : " << value << endl;
  db->Put(writeOptions, "hello1", "nice");

  if (!status.ok()) {
    cerr << status.ToString() << endl;
  }

  return 0;
}

并在CMakeLists.txt中增加下图所示内容:

图1 CMakeLists.txt文件
图1 CMakeLists.txt文件

1. 整体架构——一张图看懂LevelDB

2. 数据写入流程——一次Put()到底发生了什么?

3. MemTable——内存中的有序表是如何实现的?

4. SkipList——为什么不用红黑树?

5. WAL——崩溃恢复的第一道防线

6. SSTable——磁盘数据是如何组织的?

7. Block——Restart Point的设计思想

8. Bloom Filter——如何避免无效磁盘访问?

9. VersionSet与Manifest——元数据如何管理?

10. Compaction——LSM Tree的核心机制

11. Iterator——多路归并遍历的实现

12. 读取流程——一次Get()都经历了什么?

13. LRUCache——缓存是如何设计的?

14. 恢复流程——数据库重启时发生了什么?

15. 总结

推荐

leveldb doc

参考

Just For Fun

Ying

leveldb-handbook

reading-source-code-of-leveldb-1.23


相关内容

请作者喝杯咖啡!
AndyFree96 支付宝支付宝
AndyFree96 微信微信