MergingIterator是用于merge sort的iterator。mergeiterator内部有多个有序块,这些有序块分别有一个iterator来遍历,mergeiterator每次访问具有最小key的块。
举个例子:

如果从小到大访问,则首先通过iter2访问块2的0, 接着通过iter1访问块1的1,iter2-块2-2, iter3-块3-3…
MergingIterator是用于merge sort的iterator。mergeiterator内部有多个有序块,这些有序块分别有一个iterator来遍历,mergeiterator每次访问具有最小key的块。
举个例子:
如果从小到大访问,则首先通过iter2访问块2的0, 接着通过iter1访问块1的1,iter2-块2-2, iter3-块3-3…
TwoLevelIterator是用来访问可用 index域和 data域访问的数据。
如,sstable中的data block和index block。就是分别将index block的block iter和data block的block iter赋值给index iter和data iter.
LevelFileNumIterator用于访问一个level中的file。
其中ke存放的是 指定要访问的file的最大key。 value为16字节数据,用于存放文件序列号和文件size。
原文注释
// An internal iterator. For a given version/level pair, yields
// information about the files in the level. For a given entry, key()
// is the largest key that occurs in the file, and value() is an
// 16-byte value containing the file number and file size, both
// encoded using EncodeFixed64.
LevelFileNumIterator代码很短,直接上所有代码吧。
这篇文章我们一起来看看Block::Iter, 这个Iter顾名思义使用来访问一个block的Iter,block可以是sstable中的data block,或者index block。还记得data block的布局吗:
通过之前对LevelDB的整体流程,数据存储以及元信息管理的介绍,我们已经基本完整的了解了LevelDB。从这篇文章开始,我们将重心转移到Iterator上,这是一种统一的访问底层数据的设计模式,用户不用关心底层数据是如何存储,只需使用Iterator提供的几种操作接口,即可访问。本文是leveldb众多iterator的一个总览,后文再对各个Iterator单独分析。
本文转载自:https://www.jianshu.com/p/7fe24a77002a
leveldb是一种对写优化的kv存储系统,读性能有所下降,为了充分利用局部性原理,提高读性能,leveldb自己也设计了一个Cache结构。内部采用LRU替换策略。
截至到上文,我们已经将levedb中几个重要的组件都分析了,包括log、manifest、memtable和sstable。今天将介绍leveldb中最重要的内部操作–Compaction。
文本要介绍一个在leveldb中相当重要的数据结构 - Version及其相关的VersionEdit和VersionSet。理解了这些内容后,我们会提到leveldb系统中MANIFEST文件。