leveldb源码剖析2.4–核心设计之数据迭代器

引言

在leveldb中,迭代子模式被广泛用及、几乎贯穿于整个代码之中。

1 迭代器分类

在leveldb中,主要的迭代器如下:
在这里插入图片描述
注:除了图中的关键迭代器,还有一些迭代器,例如EmptyIterator。

  • DBIter:用于调用者迭代数据库所有数据的迭代器,是对MergingIterator的再度封装;
  • MergingIterator:用于多个数据集合的归并迭代;
  • MemTableIterator:用于缓存对象MemTable的数据迭代,相对简单的一个迭代器;
  • TwoLevelIterator:用于迭代一个文件的一个个块、或者各个level中文件的数据;
  • Version::LevelFileNumIterator:用于迭代文件;
  • Block::Iter:用于迭代一个数据块内部的数据项;

2 关键迭代器

2.1 Version::LevelFileNumIterator

该迭代器主要功能是迭代sstable文件信息。其Key为文件的largest key;Value为文件文件序列号和文件大小序列化后的数据。Value值的序列化如下:

  Slice value() const override {
    
    
    assert(Valid());
    EncodeFixed64(value_buf_, (*flist_)[index_]->number);
    EncodeFixed64(value_buf_ + 8, (*flist_)[index_]->file_size);
    return Slice(value_buf_, sizeof(value_buf_));
  }

2.2 Block::Iter

该迭代器用于迭代sstable文件中一个Block内的数据。

2.3 TwoLevelIterator

该迭代器用于遍历一个sstable文件中的数据、或多个level中的数据。以一个sstable文件为例,全部加载进内存势必耗费过多空间,于是先将Data Index Block加载到内存、然后遍历完一个Data Block再通过Data Index Block读取下一个Data Block去遍历;其实,遍历多个level中的数据也是一样的道理,先通过文件号挨着挨着加载每一个文件再往下遍历。

2.4 MergingIterator

该迭代器主要是为了遍历多个数据集合且他们有数据重复只用,由于数据是先按Key升序、再按SequenceNumber降序,所以能保证同一个Key最新的数据是靠前的。特别地,MergingIterator不会处理数据的新老判断。

2.5 DBIter

该迭代器主要是提供给调用者遍历数据库中的所有数据只用。由于MergingIterator不会处理数据的新老判断,所以DBIter基于MergingIterator之上加了对陈旧数据的过滤功能。

2 其他迭代器

注:其他迭代器相对简单,可以参考源码理解。

猜你喜欢

转载自blog.csdn.net/fs3296/article/details/108144137