本篇主要介绍leveldb中的迭代器设计。迭代器设计封装了leveldb中的所有遍历操作。一个好的设计思想应该是:每个存在容器的地方,就应该有对应容器的迭代器的设计。leveldb是一个容器,leveldb中的每个level中的所有文件组成一个容器,进行merge时,所以待合并的文件集也是一个容器,当然每个sstable文件本身也是一个容器,等等。因此,为每个容器设计一个迭代器,封装访问容器的细节是一种良好的设计思想,leveldb正是这样做的。
iterator
leveldb中的所有迭代器都继承自iterator虚基类。这个类中包含了所有迭代器的对外接口,如下图所示
这里稍微讲一下其中几个接口的定义:
首先应该谨记一点,leveldb中每个容器中的元素都是键值对,所以每个迭代器都指向一个键值对。因此 key(),value()函数接口具有萃取迭代器中键值对的作用。
valid()函数接口判断该迭代器是否有效,如果指向键值对就是有效的,否则无效。
SeekToLast()和SeekToFirst()就是将当前迭代器指向容器的结束位置和开始位置。
上面的iterator是一个虚基类,它不和任何实际容器有联系。我们知道,由于迭代器的设计依赖于实际容器的内部结构,因此需要为不同的容器设计不同的迭代器。iterator只不过定义了迭代器的用户接口而已。下面我们看一下leveldb中基于iterator继承而来的迭代器:
本篇后面将分别详细介绍这些迭代器的巧妙设计结构。
我们按照自底向上的顺序重点介绍下面这些迭代器
MemTableIterator => ( Iter => TwoLevelIterator ) => MergingIterator => DBIter
class MemTableIterator: public Iterator
这个迭代器是最简单的。因为它所涉及的