谈谈Rocksdb的迭代器

server/2024/10/9 9:21:38/

以下介绍都来自rocksdb 6.15.5版本。

get流程

我们知道Rocksdb的get流程是先从mem,再到immem。之后就是各个sst里面搜索。
具体的逻辑在BlockBasedTable::Get里面。
在这里面就是先读到indexblock,再通过NewDataBlockIterator方法使用indexblock构造出datablcok

Iterator流程

当用户做如下调用

  ReadOptions readOptions;rocksdb::Iterator* it = db->NewIterator(readOptions);

最终调用的是DBImpl::NewInternalIterator,返回了一个InternalIterator指针。里面包含了Mem,Imem,L0等等各层的迭代器。
对于具体的某个sst来说,先创建IndexReader,在创建IndexReader的时候,是根据index_type来确定的,其结构如下:

enum IndexType : char {kBinarySearch = 0x00,kHashSearch = 0x01,kTwoLevelIndexSearch = 0x02,kBinarySearchWithFirstKey = 0x03,
};

系统默认使用的是kBinarySearch。因此默认情况下IndexReader指的是BinarySearchIndexReader。
再通过IndexReader产生IndexBlockIter。
最后在BlockBasedTable::NewIterator里面,把IndexBlockIter给了BlockBasedTableIterator,用户真正持有的也是BlockBasedTableIterator。
在对单个sst进行迭代的时候,我们会发现BlockBasedTableIterator里面有两个变量:

  // 进行sst的迭代器操作的时候 index_iter_ 和  block_iter_是一组std::unique_ptr<InternalIteratorBase<IndexValue>> index_iter_;DataBlockIter block_iter_;

单个sst的迭代器如上,如果碰到对L1,L2这种一层进行迭代,那是用的就是LevelIterator。
LevelIterator里面有个file_iter_,就是这一层里面的某个具体sst的迭代器,它的确定是在version_set.cc ::NewFileIterator里面完成的。

以上逻辑和TwoLevelIterator没有关系。

参考资料

https://blog.csdn.net/dlf123321/article/details/140840457
https://blog.csdn.net/Z_Stand/article/details/111712716


http://www.ppmy.cn/server/112465.html

相关文章

SpringBoot项目路由信息自动化提取脚本

文章目录 前言工具开发1.1 ChatGPT初探1.2 初版代码效果 WebGoat适配2.1 识别常量路由2.2 适配跨行定义 进阶功能优化3.1 识别请求类型3.2 识别上下文值 总结 前言 最近工作上遇到一个需求&#xff1a;提取 SpringBoot 项目中的所有路由信息&#xff0c;本来想着这是一个再普通…

2024年携程大数据开发面试题及参考答案

目录 Java Object 类中包含的方法 hashCode 方法和 equals 方法的关系以及它们的重要性 volatile 关键字在 Java 中的作用 对 java.util.concurrent 包下的类的了解 线程池的核心参数及其作用 优先队列(PriorityQueue)的概念 红黑树 对 Hadoop 和 Spark 的了解 为什…

设计模式1:C#开发中使用创建型的工厂模式和行为型的策略模式

一、接口设计的好处 三大好处&#xff1a;解耦、可复用、可扩展。 二、简单工厂模式 【三要素】能创建具体产品的工厂、抽象产品&#xff08;接口&#xff09;、具体产品 【基本用法】字符串>创建对象>调用其方法 // 产品接口 public interface IProduct {void Opera…

9、类和对象

9.1 封装 9.1.1 封装的例子 class Student { public:string name;int age; public:void setName(string name_) {name name_;} }; int main() {Student s1;s1.setName("zhangsan");return 0; }类中的行为都叫做成员&#xff0c;例如成员属性&#xff0c;成员变量&…

前端框架有哪些?全面解析主流前端框架

一、React React 是由 Facebook 开发和维护的一个前端框架&#xff0c;它专注于构建用户界面。React 采用组件化的开发模式&#xff0c;允许开发者将用户界面拆分成多个可复用的组件。 主要特点 组件化: React 的核心是组件&#xff0c;它允许开发者将界面拆分成独立的、可复…

Aninworth算法

绪论 偏置极化信息&#xff0c;就是对极化数据做出了假设&#xff0c;再进行校准&#xff0c;得到的极化信息就更像假设的极化&#xff0c;失去了原有的一些极化信息 模型 从上面直接得到的模型可看出&#xff0c;当散射矩阵乘以发发射或解说矩阵时&#xff0c;交叉极化hv vh…

软件测试 - 性能测试 (概念)(并发数、吞吐量、响应时间、TPS、QPS、基准测试、并发测试、负载测试、压力测试、稳定性测试)

一、性能测试 目标&#xff1a;能够对个人编写的项目进行接口的性能测试。 一般是功能测试完成之后&#xff0c;最后做性能测试。性能测试是一个很大的范围&#xff0c;在学习过程中很难直观感受到性能。 以购物软件为例&#xff1a; 1&#xff09;购物过程中⻚⾯突然⽆法打开…

【Go 快速入门】Go Test 工具 | 单元测试 | 基准测试

文章目录 go test工具单元测试子测试测试覆盖率 基准测试性能比较函数重置时间并行测试 本节项目地址&#xff1a;07-UnitTestBenchmarkTest go test工具 Go语言中的测试依赖go test&#xff0c;该命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内&#xff0c;…