Leveldbソースコード分析2.4-データイテレータのコアデザイン
前書き
leveldbでは、コード全体のほぼ全体で、反復サブモードが広く使用されています。
1イテレータ分類
leveldbでは、主なイテレーターは次のとおりです。
注:図の主要なイテレーターに加えて、EmptyIteratorなどのいくつかのイテレーターもあります。
- DBIter:呼び出し元がデータベース内のすべてのデータを反復するためのイテレーター。これはMergingIteratorの再カプセル化です。
- MergingIterator:複数のデータセットをマージおよび反復するために使用されます。
- MemTableIterator:キャッシュされたオブジェクトMemTableのデータ反復のための比較的単純なイテレーターです。
- TwoLevelIterator:ファイルのブロックまたは各レベルのファイルのデータを反復処理するために使用されます。
- Version :: LevelFileNumIterator:ファイルの反復に使用されます。
- Block :: Iter:データブロック内のデータ項目を反復するために使用されます。
2キーイテレータ
2.1バージョン:: LevelFileNumIterator
イテレータの主な機能は、安定したファイル情報を反復することです。そのキーはファイルの最大のキーです。値はファイルファイルのシリアル番号とファイルサイズのシリアル化されたデータです。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ブロック:: Iter
このイテレータは、sstableファイル内のブロック内のデータを反復するために使用されます。
2.3 TwoLevelIterator
このイテレータは、安定したファイル内のデータまたは複数のレベルのデータをトラバースするために使用されます。安定したファイルを例にとると、すべてをメモリにロードすると多くのスペースが消費されるため、最初にデータインデックスブロックをメモリにロードしてから、1つのデータブロックをトラバースし、次にデータインデックスブロックを介して次のデータブロックを読み取ってトラバースします。 ;実際、トラバース同じことが複数のレベルのデータにも当てはまります。最初に各ファイルをファイル番号で並べてロードしてから、下にトラバースします。
2.4 MergingIterator
このイテレータは主に複数のデータコレクションをトラバースするために使用され、データの繰り返しがあります。データはKeyの昇順、SequenceNumberの降順であるため、同じKeyの最新データを最上位にすることができます。特に、MergingIteratorはデータの新旧の判断を処理しません。
2.5 DBIter
イテレータは主に、データベース内のすべてのデータのみをトラバースするために呼び出し元に提供されます。MergingIteratorはデータの新旧の判断を処理しないため、DBIterはMergingIteratorに基づいて古いデータのフィルタリング機能を追加します。
2その他のイテレータ
注:他のイテレーターは比較的単純であり、ソースコードを参照することで理解できます。