leveldb源码剖析---迭代器设计

本篇主要介绍leveldb中的迭代器设计。迭代器设计封装了leveldb中的所有遍历操作。一个好的设计思想应该是:每个存在容器的地方,就应该有对应容器的迭代器的设计。leveldb是一个容器,leveldb中的每个level中的所有文件组成一个容器,进行merge时,所以待合并的文件集也是一个容器,当然每个sstable文件本身也是一个容器,等等。因此,为每个容器设计一个迭代器,封装访问容器的细节是一种良好的设计思想,leveldb正是这样做的。


iterator

leveldb中的所有迭代器都继承自iterator虚基类。这个类中包含了所有迭代器的对外接口,如下图所示


这里写图片描述

这里稍微讲一下其中几个接口的定义:
首先应该谨记一点,leveldb中每个容器中的元素都是键值对,所以每个迭代器都指向一个键值对。因此 key(),value()函数接口具有萃取迭代器中键值对的作用。

valid()函数接口判断该迭代器是否有效,如果指向键值对就是有效的,否则无效。

SeekToLast()和SeekToFirst()就是将当前迭代器指向容器的结束位置和开始位置。

上面的iterator是一个虚基类,它不和任何实际容器有联系。我们知道,由于迭代器的设计依赖于实际容器的内部结构,因此需要为不同的容器设计不同的迭代器。iterator只不过定义了迭代器的用户接口而已。下面我们看一下leveldb中基于iterator继承而来的迭代器:


这里写图片描述

本篇后面将分别详细介绍这些迭代器的巧妙设计结构。

我们按照自底向上的顺序重点介绍下面这些迭代器

MemTableIterator => ( Iter => TwoLevelIterator ) => MergingIterator => DBIter


class MemTableIterator: public Iterator

这个迭代器是最简单的。因为它所涉及的

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值