存储5:按部就班 —— Iterator
Level DB中,实现了各种Iterator,Iterator有以下功能:
- 按顺序对所有的元素进行迭代;
- 处理某一范围内的元素,正序或者逆序;
- 定位到某一个特定的元素进行处理。
LevelDB在以下部分使用了迭代器:
- 对MemTable进行迭代;
- 对于SSTable的Block进行迭代;
- 对整个SSTable进行迭代;
- Level File Num Iterator,因为LevelDB的SSTable是分层的,这个Iterator对某一个版本的某一层的SSTable的文件信息进行迭代;
- Concatenating Iterator,Level > 0的SSTable是有序的,Concatenating Iterator可以对这些有序的SSTable同时迭代;
- 对MemTable、Immutable MemTable和所有的SSTable同时迭代;
- DB Iterator对整个数据库进行迭代。
以上迭代器的实现,有些是从零开始实现的,有些是组合其它迭代器实现的。为了组合其它迭代器,LevelDB实现了两种迭代器的组合方式:
- Two Level Iterator,可以组合两个迭代器A和B,其中A里面的每个元素可以产生一个迭代器B,可以迭代A,取出一个元素产生迭代器B,然后迭代B,然后再产生A的下一个元素,再产生一个迭代器B,如此往复;
- Merger Iterator可以组合多个迭代器,同时对多个迭代器进行迭代,就好像对这些迭代器做了一次归并排序,产生结果。
Iterator接口
// include/leveldb/iterator.h
class LEVELDB_EXPORT Iterator {
public:
...
// 当前迭代器是否有效
virtual bool Valid() const = 0;
// 定位到某个键,当键不存在时,定位到比这个键大的第一个键
virtual void Seek(const Slice& target) = 0;
// 定位到下一项
virtual void Next() = 0;
// 定位到前一项
virtual void Prev() = 0;
// 返回当前键
virtual Slice key() const = 0;
// 返回当前值
virtual Slice value() const = 0;
// 返回当前迭代器状态
virtual Status status() const = 0;
// 迭代器被销毁时的回调函数,注册后可在销毁时调用
using CleanupFunction = void (*)(void* arg1, void* arg2);
void RegisterCleanup(CleanupFunction function, void* arg1, void* arg2);
...
};
LevelDB的Iterator</