iterator获取当前元素_[LevelDB] 存储5:按部就班 —— Iterator

本文详细介绍了LevelDB中的Iterator实现,包括Two Level Iterator、Merger Iterator、MemTable Iterator等,阐述了如何通过这些迭代器对MemTable、SSTable、Block等进行有序遍历,并展示了它们在不同场景下的应用,如DB Iterator和Concatenating Iterator,揭示了LevelDB的内部数据结构和迭代逻辑。
摘要由CSDN通过智能技术生成

04392dc462ccd18d9030fed410f641c7.png

存储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</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值