leveldb 笔记
leveldb实现解析 那岩
一 代码目录结构
1. doc/
2.include/leveldb/
3. db/
主要逻辑的实现。包括:
- 接口的实现 (db_impl/db_iter)
- 内部结构的定义(dbformat/memtable/skiplist/write_batch)
- db运行状态以及操作的包装
- log格式相关
- filename处理相关
- sstable相关
4. table/
sstable相关的数据格式定义以及操作实现
5. port/
6.util/
7. helper/memenv/
实现了一个简单的完全内存的文件系统,提供操作目录文件的接口。
二 基本概念
1. Slice(include/leveldb/slice.h)
为操作数据的方便,将数据和长度包装成 Slice 使用,直接操控指针避免不必要的数据拷贝。
2. Option(include/leveldb/optin.h)
leveldb 中启动时的一些配置,通过 Option 传入,get/put/delete 时,也有相应的 ReadOption/WriteOption。
1 | // include/leveldb/option.h |
1 | // include/leveldb/option.h |
1 | // include/leveldb/option.h |
另外还有一些编译时的常量,与 Option 一起控制。
1 | // db/dbformat.h |
1 | // db/version_set.cc |
3. Env (include/leveldb/env.h util/env_posix.h)
考虑到移植以及灵活性,leveldb 将系统相关的处理(文件/进程/时间之类)抽象成 Env,用户可以自 己实现相应的接口,作为 Option 传入。默认使用自带的实现。
4. varient(util/coding.h)
leveldb 采用了 protocalbuffer 里使用的变长整形编码方法,节省空间
5. ValueType(db/dbformat.h)
leveldb 更新(put/delete)某个 key 时不会操控到 db 中的数据,每次操作都是直接新插入一份 kv 数 据,具体的数据合并和清除由后台的 compact 完成。所以,每次 put,db 中就会新加入一份 KV 数据, 即使该 key 已经存在;而 delete 等同于 put 空的 value。为了区分真实 kv 数据和删除操作的 mock 数 据,使用 ValueType 来标识:
1 | enum ValueType { |