大白话解析LevelDB 4: 查找一个 Key

文章目录

  • 查询一个 Key
    • 查找 Key 的入口: DBImpl::Get(const ReadOptions& options, const Slice& key, std::string* value)
      • 从 MemTable 中查找
      • 从 Immutable MemTable 中查找
      • 从 SST 中查找

查询一个 Key

查找 Key 的入口: DBImpl::Get(const ReadOptions& options, const Slice& key, std::string* value)

LevelDB 中查询一个Key的接口为Status DBImpl::Get(const ReadOptions& options, const Slice& key, std::string* value);,其实现如下。

Status DBImpl::Get(const ReadOptions& options, const Slice& key, std::string* value) {Status s;MutexLock l(&mutex_);// 如果 options 中指定了 Snapshot,就使用该 Snapshot。// 否则的话,隐式的创建一个最新的 Snapshot,从该 Snapshot // 中查询 Key。SequenceNumber snapshot;if (options.snapshot != nullptr) {snapshot = static_cast<const SnapshotImpl*>(options.snapshot)->sequence_number();} else {snapshot = versions_->LastSequence();}// Key 可能存在 3 个地方://   - MemTable//   - Immutable MemTable//   - SST// 这 3 个地方都需要查,先把它们的引用计数加 1,防止中途被销毁。MemTable* mem = mem_;MemTable* imm = imm_;Version* current = versions_->current();mem->Ref();if (imm != nullptr) imm->Ref();current->Ref();bool have_stat_update = false;Version::GetStats stats;{// 进入查询流程了,对 Memtable, Immutable Memtable 和 SST 只会做读取操作,// 不会做写操作,所以可以先释放锁,允许其他线程继续写入。mutex_.Unlock();// 基于 UserKey 和 Snapshot 构造一个 LookupKey,使用该 LookupKey 来做查询。LookupKey lkey(key, snapshot);if (mem->Get(lkey, value, &s)) {// 优先在 MemTable 中查找,如果查找成功,就不会在 Immutable MemTable 和 SST 中查找了。} else if (imm != nullptr && imm->Get(lkey, value, &s)) {// MemTable 中没找到,就在 Immutable MemTable 中查找。} else {// MemTable 和 Immutable MemTable 都没找到,就在 SST 中查找。// 把 have_stat_update 标记为 true,表示在 SST 中进行查找了。// 在 SST 中查找完后,会将查找的额外信息存放到 stats 中://   - 读取了哪个 SST//   - 读取到 SST 位于哪一层s = current->Get(options, lkey, value, &stats);have_stat_update = true;}mutex_.Lock();}// 如果是从 SST 中查找的 Key,并且该 SST 的累计无效查找次数达到了阈值,// 那么就将该 SST 标记为待 Compaction,并尝试触发一轮 Compaction。if (have_stat_update && current->UpdateStats(stats)) {MaybeScheduleCompaction();}// 查找完毕,将 MemTable, Immutable MemTable 和 SST 的引用计数减 1。mem->Unref();if (imm != nullptr) imm->Unref();current->Unref();return s;
}

查询一个Key的流程如下:

从 MemTable 中查找

使用MemTable::Get(const LookupKey& key, std::string* value, Status* s)优先在MemTable中查找,如果查找成功,就不会在Immutable MemTableSST中查找了。

MemTable::Get(const LookupKey& key, std::string* value, Status* s)的具体实现可移步参考大白话解析LevelDB:MemTable。

从 Immutable MemTable 中查找

Immutable Table其实就是MemTable,只是为了与MemTable做区分,把名称叫做Immutable MemTable,但代码实现中,Immutable MemTableMemTable都是Class MemTable

MemTable* mem = mem_;
MemTable* imm = imm_;

所以,Immutable MemTable的查找实现与MemTable的查找实现是同一个接口,不再赘述啦。

从 SST 中查找

如果前面在MemTableImmutable MemTable中都没找到目标 Key,就只能从SST中查找了。

每个SST文件都有个MetaData,记录了该SST文件的一些元信息,比如该SST文件的最小Key、最大Key、该SST文件的序列号等等。

当我们需要查找一个特定的Key时,会先构造一个列表,通过读取SST的元信息,将可能包含这个KeySST放入列表中,再逐个查找目标Key

当我们对某个SST文件进行查找后,没有找到目标Key,就会把该SSTallowed_seeks减一。当allowed_seeks减到 0 时,就会将该SST标记为待Compaction

SST中查找指定Key的函数为Version::Get(const ReadOptions& options, const LookupKey& k, std::string* value, GetStats* stats),具体实现可移步参考大白话解析LevelDB: Version。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫---scrapy的post请求

爬虫文件&#xff1a; import scrapyclass TestpostSpider(scrapy.Spider):name "testpost"allowed_domains ["fanyi.baidu.com"]# post 请求如果没有参数&#xff0c;那么这个请求将没有任何意义&#xff0c;所以start_urls也没有用了&#xff0c;pars…

Mysql 索引优化

Mysql 索引优化 mysql如何选择使用索引。 select *from user where username a and password b如果useranme和password都是普通索引&#xff0c;那么他们会把2个索引都查出来&#xff0c;然后在把他们的交集拿出来 如果username是唯一索引&#xff0c;password是普通索引&…

探究React中的非受控组件:自由而简便的表单处理

探究React中的非受控组件&#xff1a;自由而简便的表单处理 在React中&#xff0c;我们常听到"受控组件"的概念&#xff0c;但同样存在一种自由度更高、处理简便的形式——非受控组件。本文将深入介绍非受控组件的使用&#xff0c;通过代码片段中的登录表单实例&…

Java 面试题之 IO(二)

字符流 文章目录 字符流Reader&#xff08;字符输入流&#xff09;Writer&#xff08;字符输出流&#xff09; 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 不管是文件读写还是网络发送接收&#xff0c;信息的最小存储单元都是字节。 那为什么 I/O 流操作要分为字…

状态管理与导航守卫

为什么要用vuex&#xff1f; 进行统一的状态管理&#xff0c;解决不同组件共享数据的问题。 如何使用vuex&#xff1f; 1.安装引入 npm install vuex --save 2.注册到vue中 import Vue from vue import Vuex from vuexVue.use(Vuex)3.实例化vuex的store export default new Vue…

算法训练营总结

目录 收获思考感悟后续 收获 不知不觉&#xff0c;已经跟着训练营刷了两个月的题。 之前也跟着代码随想录刷了一大半&#xff0c;因为出差中断没有坚持下来&#xff0c;仅有的基础也扔下了不少。 而这两个月跟着训练营最大的收获就是坚持&#xff0c;不会的题硬啃几天也要搞…

Java 与 JavaScript的区别

Java 与 JavaScript的区别 Java 与 JavaScript&#xff1a;概述Java的特点JavaScript 的起源JavaScript 的特点Java 与 JavaScript&#xff0c;哪个更好&#xff1f;JavaScript 与 Java 相似吗&#xff1f;Java 与 JavaScript 的区别JavaScript 在服务器端的运行方式是怎样的&a…

网络防御安全知识(第二版)

安全策略 传统的包过滤防火墙 --- 其本质为ACL列表&#xff0c;根据数据报中的特征进行过滤&#xff0c;之后对比规制&#xff0c; 执行动作。 五元组 --- 源IP&#xff0c; 目标IP&#xff0c;源端口&#xff0c; 目标端口&#xff0c;协议 安全策略 --- 相较于ACL的改进之…

网站打不开怎么办?高防IP弹性防护更省心

不管你是什么网站&#xff0c;商城网站、游戏网站或者支付网站都有可能存在被攻击的情况&#xff0c;超过防护就会被打死&#xff0c;网站随即而来就打不开了。网站打不开怎么办&#xff1f;看看是不是网站主机或者服务器被攻击了。攻击的大小不可控&#xff0c;选择高防服务器…

Linux/Delivery

Enumeration nmap 首先扫描目标端口对外开放情况&#xff0c;第一轮扫描发现对外开放了22,80,8065三个端口&#xff0c;端口详细信息如下 nmap -sC -sV -p 22,80,8065 10.10.10.222 nmap显示22端口运行着ssh服务&#xff0c;80端口运行着http服务&#xff0c;8065端口运行的…

微信小程序 如何调用微信支付接口

前提&#xff1a; 小程序为企业小程序 并开通了 微信打款认证 例子&#x1f330;&#xff1a; 我们这里以订单为例子 1.创建订单 朝后端发送订单id 或信息 2.后端生成 时间戳/随机字符/id/后端算法签名 3.将获取到的数据 塞入 wx.requestPayment然后就可以掉起为微信支付…

基于go mod模式创建项目最佳实践

希望能带给你成功的喜悦&#xff01; 除go get、vendor这两种方式外&#xff0c;Go版本在1.11之后推出了go module模式来管理依赖&#xff0c;使用go mod时下载的依赖文件在$GOPATH/pkg/mod/下。本文以两种办法介绍如何创建go mod项目。 目录 goland开启玩法 本地手动创建项目…

【Linux】Linux下多线程

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 前置&#xff1a;进程地址空间和页表1.1 如何看待进程地址空间和页表1.2 虚拟地址…

MIAOYUN获评OpenCloudOS社区2023年度优秀贡献企业

近日&#xff0c;OpenCloudOS社区发布了社区年度贡献企业榜单&#xff0c;成都元来云志科技有限公司&#xff08;简称“MIAOYUN”&#xff09;凭借对国产开源的热情&#xff0c;及对操作系统产业的支持&#xff0c;通过兼容适配互认证&#xff0c;为推动OpenCloudOS规模化应用&…

python数据类型-数字类型

1. 整型 整型即整数类型&#xff0c;对应于python中的int类型&#xff0c;包含&#xff1a;0&#xff0c;正整数&#xff0c;负整数 数字前面加上进制修饰符代表该数字是几进制&#xff0c;如0b1010则代表二进制&#xff0c;其输出结果为十进制10。默认不加任何进制修饰符为十…

使用IP爬虫代理提取数据的步骤是什么?爬虫代理IP怎么提高采集效率?

​​​​​ 一、使用IP爬虫代理提取数据的步骤 在使用爬虫代理IP提取数据之前&#xff0c;需要先了解数据来源和目标网站的结构。以下是一个基本的步骤&#xff1a;1.确定数据来源 首先需要确定要提取数据的网站或数据源&#xff0c;了解网站的结构、数据存储方式以及数据更新…

Qt应用软件【协议篇】Modbus详细介绍

文章目录 概述Modbus 485协议概述在工业自动化中的应用 通信模式数据模型功能码 Modbus RTU示例 1&#xff1a;读取保持寄存器示例 2&#xff1a;写入单个线圈示例 3&#xff1a;写入多个保持寄存器报文传输 Modbus ASCII报文示例报文传输 Modbus TCP报文示例报文传输 概述 在…

如何将iPad连接到USB设备?这里提供了详细步骤

本文介绍了如何将iPad连接到USB设备。说明适用于所有版本的iPad。 将USB设备与带USB-C端口的iPad一起使用 以下iPad具有USB-C端口: 自2018年第三代以来的iPad Pro机型 自2020年第四代以来的iPad Air机型 自2021年第六代以来的iPad迷你机型 自2022年以来的第十代iPad机型 这些…

PINN物理信息网络 | 混合变量PINN求解纳维-斯托克斯方程

混合变量物理神经网络(Mixed Variable Physics-Informed Neural Network,PINN)是一种将物理知识与神经网络相结合的方法,用于求解偏微分方程(Partial Differential Equations,PDEs)的数值解。纳维-斯托克斯方程是一种描述流体运动的PDE,可以通过混合变量PINN方法进行求…