关于rocksdb:RocksDB剖析系列-Iterator
参考: https://github.com/facebook/r...https://github.com/facebook/r...https://blog.csdn.net/Z_Stand...https://www.jianshu.com/p/f57...https://book.tidb.io/session3...https://www.iggiewang.cn/2021...IntroductionRocksDB的Iterator在通过高度封装后,能够像C++ stl库为每一个容器结构的迭代器的iterator一样被应用,它能够定位到某个key,并能够从这个key开始进行scan,它也能够被用来进行反向scan。 如果在创立迭代器时,ReadOptions.snapshot被给定,迭代器将返回该snapshot的数据,如果传入的为nullptr,隐性视图将被创立,隐性视图不能转为显性。 用户对Iterator的应用NewIterator 创立一个迭代器,须要传入ReadOptionsSeek 查找一个keySeekToFirst 迭代器挪动到db的第一个key地位,个别用于程序遍历整个db的所有keySeekToLast 迭代器挪动到db的最初一个key地位, 个别用于反向遍历整个db的所有keySeekForPrev挪动到以后key的上一个地位,个别用于遍历(limit, start]之间的keyNext 迭代器挪动到下一个keyPrev迭代器挪动到上一个keyIterator::status()能够返回以后迭代器的error。error蕴含IO error,checksum不匹配,外部谬误等... 如果没有谬误,状态为Status::OK()。如果Iterator::Valid()是true,status必定为OK。而如果Iterator::Valid()为false,可能是因为此时迭代器走到了数据的开端,这种状况status是OK;也有可能是呈现了谬误,这种状况status不是OK。 5.13.x或更早的版本中,这两个API会有不同,须要再查阅文档。 各Iterator DBIterImplementation: db/db_iter.ccInterface: IteratorDBIter是对InternalIterator的封装,它的工作次要是将Internal key解析成user key,并展现进去 Example底层的InternalIterator中 InternalKey(user_key="Key1", seqno=10, Type=Put) | Value = "KEY1_VAL2"InternalKey(user_key="Key1", seqno=9, Type=Put) | Value = "KEY1_VAL1"InternalKey(user_key="Key2", seqno=16, Type=Put) | Value = "KEY2_VAL2"InternalKey(user_key="Key2", seqno=15, Type=Delete) | Value = "KEY2_VAL1"InternalKey(user_key="Key3", seqno=7, Type=Delete) | Value = "KEY3_VAL1"InternalKey(user_key="Key4", seqno=5, Type=Put) | Value = "KEY4_VAL1"DBIter将Internal Key解析为User Key,并裸露接口给用户 Key="Key1" | Value = "KEY1_VAL2"Key="Key2" | Value = "KEY2_VAL2"Key="Key4" | Value = "KEY4_VAL1"MergingIteratorImplementation: table/merging_iterator.ccInterface: InternalIteratorMergingIterator由很多Children Iterator组成 ...