LevelDB 是 Google 开发的一款经典的 Key-Value 数据库。它的代码简洁优雅,非常适合作为学习数据库的阅读材料。
LevelDB 使用 LSM-Tree 结构,利用硬盘顺序写远远快于随机写的特点,来实现极高的写入性能。
由于许多机制需要分散在各处的代码互相配合才能实现,为了便于理解我们编写了一系列文章(并画了一大堆图)进行归纳梳理,以期为读者提供一个宏观的视角:
- 01-概论
- 02-工具类
- 03-MemoryTable
- 04-预写日志格式及读写流程
- 05-SSTable格式
- 06-SSTable构造流程
- 07-写入流程
- 08-MinorCompaction
- 09-元数据管理Manifest
- 10-MajorCompaction
已经注释或介绍过的的源文件:
源文件 | 功能介绍 | 相关文章 |
---|---|---|
include/leveldb/db.h | leveldb 对外暴露的接口 | |
db/db_impl.cc | leveldb 的核心逻辑 | 从 07-写入流程 开始, 后面的文章都与它相关 |
slice.h | 字符串类 | 02-工具类 |
util/coding.h | varint 和 fixedint 等编码 | 02-工具类 |
arena.h / arena.cc | 一种简单高效的内存管理方式 | 02-工具类 |
memtable.h/memtable.cc | 内存中的有序表 | 03-MemoryTable |
skiplist.h | MemTable 底层的跳表实现 | 03-MemoryTable |
log_writter.cc | 预写日志的写入 | 04-预写日志格式及读写流程 |
log_reader.cc | 预写日志的读取 | 04-预写日志格式及读写流程 |
table_builder.h / table_builder.cc | sstable 构造器 | 06-SSTable构造流程 |
block_builder.h / block_builder.cc | sstable 中块(block)的构造流程 | 06-SSTable构造流程 |
filter_block.cc | filterBlock 用于快速判断sstable中是否包含某个 key | 06-SSTable构造流程 |
WriteBatch.h/WriteBatch.cc | 写事务数据结构 | 07-写入流程 |
version_set.h / version_set.cc | 维护各层 sstable 的元数据 | 09-元数据管理Manifest |
version_edit.h / version_edit.cc | version_edit 是一次元数据变更 | 09-元数据管理Manifest |
首先你需要 fork 本仓库到你自己的 github 仓库,点击右上角的 fork 按钮🎉🎉
使用 git clone 命令将本仓库拷贝到你的本地文件,git clone 地址请点开项目上方的绿色 "code" 按钮查看😀😀
在你的本地对代码进行一番精心修改吧!🍉🍉
修改完后,是时候该上传你的改动到你 fork 来的远程仓库上了。你可以用 git bash,也可以使用 IDE 里的 git 来操作。对于 git 不熟的用户建议使用 IDE,IDE 也更方便写 commit 信息,别忘了写 commit 信息哦!当然我们只是增删改中文注释,如果要直接在 github 上编辑也可以,你可以使用最简单的在线编辑功能(预览文件的时候点击右上角的笔🖊),或者你也可以在你的仓库首页按一下句号键使用 github 提供的在线 vscode 。🤔🤔
上传之后,点进你的仓库主页,会出现一个 "Contribute",点击它,选择 "Open pull request",选择好你仓库的分支和你想要在这里合并的分支后,点击 "Create pull request",之后填写你的 PR 标题和正文内容,就成功提交一个 PR 啦!🍭🍭
记得检查修改自己的 GitHub Public profile 里的 Name 和 Public email,位置在右上角头像的 Settings 里,因为大多数情况下我们会使用 squash merge 来合并 PRs,此时 squash merge 后产生的新提交作者信息会使用这个 GH 信息(如果你的信息想公开的话)。
- 给未有中文注释的函数添加中文注释。
- 修改本仓库中的文章或者添加新的文章
- 修改或删除意思不明确的,意思有误的,有错别字的中文注释。
- 修改不标准的注释格式,修改比较严重的标点错误(中文字用英文逗号、句号、括号、引号实际上不需要修改)。
- 给中文注释不足的函数添加注释。
- 请使用 UTF-8 编码进行注释。
- 英文和中文之间要有一个空格。
- 注释里的文字内容与注释符号之间有一个空格