leveldb源码阅读笔记
leveldb是c++实现的键值对数据库,代码质量和性能都不错,很值得学习。 自己主要看两方面:c++代码风格和实现原理。
c++代码风格
- 类名和类的函数名首字母大写,驼峰命名
- 类和结构体中的变量用下划线命名,最后加一个下划线
- 大括号不单独另起一行
- 数字变量统一用stdint中的,例如
int64_t,uint64_t - 带有函数的用class,只是存几个变量用struct
- include先引用c标准库头文件,然后是c++标准库头文件,最后自己项目的头文件
- 为了变量简短,引用c标准库头文件
- c++标准库都加std::域限制,不用using namespace std;
- 引用和指针修饰符都紧挨类型
实现原理
leveldb的数据在磁盘上有序排列,之所以高性能是先写日志,日志写成功及成功,此时宕机也能从日志中恢复出来。 也就是应用LSM (Log Structured Merge) 策略,来保证高性能和高可用。
另外还有
- Bloom Filter,对于bloom filter的支持是在最新的1.4版本中加入的,此前的一次查询, LevelDB可能需要在每个level上进行一次磁盘随机访问。 通过使用bloom filter可以大大减少所需要的随机访问操作次数。 假设调用者正在查找一个值为”Foo”的key,LevelDB会从每个level下选择相应的SSTable文件(那些range包含了该key的文件), 之后会在这些SSTable文件上进行随机读。如果每个SSTable都有一个对应的bloom filter, 那么查找时就可以很容易地通过检查bloom filter跳过那些不包含该key的SSTable文件。