LevelDB 源码阅读:布隆过滤器原理、实现、测试与可视化

LevelDB 中数据存储在 SSTable 文件中,当用 Get() 来查询 key 的时候,可能需要从 SST 文件中读取多个块。为了减少磁盘读取,LevelDB 提供了 FilterPolicy 过滤策略,如果判断出来一个 Key 不在当前 SSTable 文件中,那么就可以跳过读取该文件,从而提高查询效率。

LevelDB 支持用户自定义过滤策略,不过提供了一个默认的布隆过滤器实现。布隆过滤器是一种空间效率极高的数据结构,用于判断一个元素是否存在于一个集合中,有一定的误判率但没有漏判。简单说就是如果布隆过滤器判断一个元素不存在,那么这个元素一定不存在;如果布隆过滤器判断一个元素存在,那么这个元素可能不存在

阅读全文

LevelDB 源码阅读:准备开发环境

LevelDB 是 C++ 开发的优秀的 LSM Tree 的存储组件,整体代码量不大,但是设计精巧,值得学习。在阅读源码过程中,整理了系列文章,逐步拆解 LevelDB 的实现细节。不过在阅读代码前,最好先准备好整个开发环境。

本文会从最基本的拉取代码开始,记录自己准备整个环境的过程,包括配置 VSCode IDE 和 clangd 插件使用,以及如何配置编译选项等。然后会通过简单的读写代码 demo,来简单使用下 LevelDB,对这个库有个感性的认识。另外,还会介绍如何运行测试用例,LevelDB 的测试用例写的很好,在代码阅读过程中,可以借助用例更好的理解代码。

阅读全文

LevelDB 源码阅读:Posix 文件操作接口实现细节

LevelDB 支持在各种操作系统上运行,为了适配不同的操作系统,需要封装一些系统调用,比如文件操作、线程操作、时间操作等。在对外暴露的 include 文件中,env.h 文件定义了 LevelDB 用到的各种接口。包括 Env 类,封装文件操作,目录操作等,还有一些文件抽象类,比如 SequentialFile、WritableFile、RandomAccessFile 3 个类,用于顺序读取,随机读取和写入文件。

通过抽象接口,只需要为每个平台实现相应的 Env 子类,LevelDB 就可以在不同的操作系统上运行。这篇文章以 POSIX 系统环境为例,先来看看抽象出来的和文件操作相关的接口是怎么实现的。

阅读全文