Level DB --- Block

class Block

class Block是Level DB里面的重要数据结构,该数据结构用来承载已经存储到文件中的数据。已经被存储的数据当需要再次加载、应用(例如搜索),这时首先要把数据加载、初始化到class Block里面。

数据的组织形式:

数据

数据的组织形式如图1所示。data表示指向数据的指针,size表示整个数据的大小。在数据组织上,数据里面采用了多个restart的结构,每个restart有一个完整的key字符串序列,在restart后续的数据,会采用和前一个key值差值的方式存储。在若干个key-value数据后,又会有一个新的restart数据。整个value最后一个4byte数据用来存储一共有多少个restart结构数据。

                                                                图1 Block 承载的数据流

restart数据

每个restart数据可以保存完整的key,然后是该key对应的完整的value数据。再后续的数据其中的key都是和上一个数据的差值部分,value数据依然是完整存储。

差值key的数据表示:

*shared = reinterpret_cast<const uint8_t*>(p)[0];
*non_shared = reinterpret_cast<const uint8_t*>(p)[1];

value表示:

*value_length = reinterpret_cast<const uint8_t*>(p)[2];

经过若干个这样的结构,又会重新有一个restart结构。

整个entry的内存组织形式如图2所示

                                                      图2 单个entry的内存数据组织

restart数据检索

restart结构offset结构数据数组的起始地址:

restart_offset_ = size_ - (1 + NumRestarts()) * sizeof(uint32_t);

restart_offset_之后,记录restart数据长度的最后4个byte之前,这段连续的数组里面就记录每个restart在整个数据里面的offset,具体的代码如下:

uint32_t GetRestartPoint(uint32_t index) {assert(index < num_restarts_);return DecodeFixed32(data_ + restarts_ + index * sizeof(uint32_t));}

里面的restarts_是restart_offset_,他们俩是同一个数据。

Block  Iterator

Block Iterator 是 Block 和 外界的一个interface,对Block的操作都是通过对Iterator的函数方法使用来实现的。下面介绍一下这些函数方法。

Iterator的数据成员

//comparator 是比较key的函数方法
const Comparator* const comparator_;//对应Block里面的data指针
const char* const data_;//restart的数量
uint32_t const num_restarts_;//iterator当前位置的offset
uint32_t current_;//iterator当前所对应的restart的index
uint32_t restart_index_;//当前位置entry的key序列
std::string key_;//当前位置entry的value序列
Slice value_;Status status_;

Iterator的函数成员

//key 比较
inline int Compare(const Slice& a, const Slice& b) //下一个entry(key-value结构存储)的地址(offset)。
inline uint32_t NextEntryOffset() const //该函数提供第index个restart的地址(offset)
uint32_t GetRestartPoint(uint32_t index)//当前Iterator是否合法,这里面主要是通过当前entry的offset是否已经超过了数据所在的地址范围
bool Valid() const//获得下一个entry的key和value,同时更新current_和restart_index_
bool ParseNextKey()//整个Iterator位置调整到第一个restart位置,以及更新key_、value_、current_和restart_index_到第一个entry值
void SeekToFirst() override//整个Iterator位置调整到最后一个restart位置,以及更新key_、value_、current_和restart_index_到最后一个entry值
void SeekToLast() override//检索特定的key,在restart检索用到了二分查找,找到特定的restart使用线性查找
void Seek(const Slice& target) override//整个Iterator位置调整到当前位置的前一个位置,以及更新key_、value_、current_和restart_index_到当前位置前一个位置的entry值
void Prev() override//整个Iterator位置调整到当前位置的前一个位置,以及更新key_、value_、current_和restart_index_到当前位置后一个位置的entry值
void Next() override

总结

总结一下,Block是一个核心结构,代码逻辑清晰。这里面有几点好的设计可以借鉴:

1.使用restart + diff key的形式,由于key都是有序的,所以一个key和他前一个key的序列重复度应该是很高的,这样做可以有效提高存储效率。

2.使用restart,有益于检索效率,可以应用二分检索,否则只能使用顺序检索。

3.Block Iterator Iterator的使用恰当好处。

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

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

相关文章

记录大学Linux运维上机考试题目和流程

备注&#xff1a;今年的Linux操作系统考试已经全部结束&#xff0c;仅作为一个记录和留念 前提&#xff1a;配置环回网卡和环境和nat网卡 1、搭建dns服务器 2、Apache和http服务 3、搭建postfix邮件服务器实现邮件发送 4、搭建vsftpdFTP服务器实现文件上传 题目如下&…

前端面试笔试(四)

目录 一、数据结构算法等综合篇 1.线性探查法解决哈希冲突 2.请求分页系统中文件区和对换区 3.RADIUS认证协议&#xff0c;运行在哪个网络协议上 二、代码输出篇 1.res[1,2,100].map(parseInt) 如果我们想要输出为[1,2,100]&#xff0c;可以&#xff1a; 还可以换map里…

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势

随着信息技术的快速发展和数字化时代的到来&#xff0c;安防监控领域也在不断进行技术创新和突破。NVR管理平台EasyNVR作为视频汇聚技术的领先者&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;展现出了在安防监控领域巨大的应用潜力和价值。本文将详细介绍Easy…

C/C++运行库

文章目录 入口函数glibc入口函数_start__libc_start_mainMSVC入口函数堆初始化IO初始化 glibc C运行库glibc启动文件gcc补充C全局构造与析构 运行库对于多线程的改进线程局部存储 入口函数 使用C语言编写的一个hello world程序在用户看来的确非常简单&#xff0c;源代码仅需要…

学习使用LVGL,依赖官方网址

LVGL Basics — LVGL documentation LVGL基础知识 LVGL是一个开源的图形库&#xff0c;提供创建嵌入式GUI的一切 LVGL数据流 您为每个物理显示面板 创建一个显示器 (lv_display) &#xff0c;在其上创建屏幕小部件&#xff0c;将小部件添加到这些屏幕上。要处理触摸、鼠标、…

计算机网络HTTP——针对实习面试

目录 计算机网络HTTP什么是HTTP&#xff1f;HTTP和HTTPS有什么区别&#xff1f;分别说明HTTP/1.0、HTTP/2.0、HTTP/3.0请说明访问网页的全过程请说明HTTP常见的状态码Cookie和Session有什么区别&#xff1f;HTTP请求方式有哪些&#xff1f;请解释GET和POST的区别&#xff1f;HT…

大数据-226 离线数仓 - Flume 优化配置 自定义拦截器 拦截原理 了 拦截器实现 Java

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

无人机动力系统测试-实测数据与CFD模拟仿真数据关联对比分析

我们经常被问到这样的问题&#xff1a;“我们计划运行 CFD 仿真&#xff0c;我们还需要对电机和螺旋桨进行实验测试吗&#xff1f;我们可能有偏见&#xff0c;但我们的答案始终是肯定的&#xff0c;而且有充分的理由。我们自己执行了大量的 CFD 仿真&#xff0c;但我们承认&…

验证双随机矩阵(doubly stochastic matrix) 满足C(P)=C(P^T)

验证双随机矩阵(doubly stochastic matrix) 满足C( P P P)C(P T ^T T) 双随机矩阵&#xff1a; 在数学中&#xff0c;一个双随机矩阵&#xff08;doubly stochastic matrix&#xff09;是一个满足以下条件的矩阵&#xff1a; 非负矩阵&#xff1a;矩阵中的每个元素都是非负的…

Chrome 浏览器开启打印模式

打开开发者工具ctrl shift p输入print 找到 Emulate CSS print media type

Vite初始化Vue3+Typescrpt项目

初始化项目 安装 Vite 首先&#xff0c;确保你的 Node.js 版本 > 12.0.0。然后在命令行中运行以下命令来创建一个 Vite Vue 3 TypeScript 的项目模板&#xff1a; npm init vitelatest进入项目目录 创建完成后&#xff0c;进入项目目录&#xff1a; cd vue3-demo启动…

24 年第十届数维杯国际数模竞赛赛题浅析

本次万众瞩目的数维杯国际大学生数学建模赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是数模届的独一档&#xff0c;含金量极高&#xff0c;可以用于综测加分、保研、简历添彩等各方面。考虑到大家解题实属不易&#xff0c;为了帮助大家取得好成绩…

自动语音识别(ASR)与文本转语音(TTS)技术的应用与发展

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

CentOS8 启动错误,enter emergency mode ,开机直接进入紧急救援模式,报错 Failed to mount /home 解决方法

先看现场问题截图&#xff1a; 1.根据提示 按 ctrld 输入 root 密码&#xff0c;进入系统。 2. 在紧急模式下运行&#xff1a;journalctl -xe &#xff0c;查看相关日志&#xff0c;找到关键点&#xff1a; Failed to mount /home 3.接着执行修复命令&#xff1a; xfs_repa…

Java项目实战II基于微信小程序的课堂助手(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字化教…

借助 Pause 容器调试 Pod

借助 Pause 容器调试 Pod 在 K8S 中&#xff0c;Pod 是最核心、最基础的资源对象&#xff0c;也是 Kubernetes 中调度最小单元。在介绍 Pause 容器之前需要先说明下 Pod 与容器的关系来理解为什么需要 Pause 容器来帮助调试 1. Pod 与 容器的关系 Pod 是一个抽象的逻辑概念&…

IDEA自定义文件打开格式

介绍在IDEA中自定义文件打开格式的方法&#xff0c;比如一个文件&#xff0c;可以选择用txt格式打开&#xff0c;也可以选择用xml格式打开&#xff0c;也可以用java格式打开等等&#xff0c;通过这个方法可以方便的用任意格式在idea中打开想要打开的文件。 下面分别讨论三种不…

Git 分⽀规范 Git Flow 模型

前言 GitFlow 是一种流行的 Git 分支管理策略&#xff0c;由 Vincent Driessen 在 2010 年提出。它提供了一种结构化的方法来管理项目的开发、发布和维护&#xff0c;特别适合大型和复杂的项目。GitFlow 定义了一套明确的分支模型和工作流程&#xff0c;使得团队成员可以更有效…

ECG心电前级信号提取

由于ECG信号很微弱&#xff0c;处于mV级别&#xff0c;还有很多干扰信号&#xff0c;所以采集信号时需要进行滤波和放大处理&#xff0c;然后使用模数转换。为了滤波高频干扰和工频噪声&#xff0c;需要使用低通滤波器和陷波器抑制噪声&#xff0c;有时也要使用高通滤波器滤除低…