读取

读取 - 图1

leveldb读取分为三步:

  • 在memory db中查找指定的key,若搜索到符合条件的数据项,结束查找;

  • 在冻结的memorydb中查找指定的key,若搜索到符合条件的数据项,结束查找;

  • 按低层至高层的顺序在leveli层的sstable文件中查找指定的key,若搜索到符合条件的数据项,结束查找,否则返回NotFound错误,表示数据库中不存在指定的数据;

注解

注意leveldb在每一层sstable中查找数据时,都是按序依次查找sstable的。

0层的文件比较特殊。由于0层的文件中可能存在key重合的情况,因此在0层中,文件编号大的sstable优先查找。理由是文件编号较大的sstable中存储的总是最新的数据。

非0层文件,一层中所有文件之间的key不重合,因此leveldb可以借助sstable的元数据(一个文件中最小与最大的key值)进行快速定位,每一层只需要查找一个sstable文件的内容。

在memorydb或者sstable的查找过程中,需要根据指定的序列号拼接一个internalKey,查找用户key一致,且seq号不大于指定seq的数据,具体的查找过程可见《内存数据库》和《sstable》两篇文章。