leveldb源码剖析--key-value形式的Block块中的数据存储格式

本文深入剖析leveldb数据存储,重点关注Block中data block和index block的内部结构。通过BlockBuilder类,探讨key-value如何利用公共前缀压缩存储,以及如何通过restart_数组记录压缩集合的位置,提升空间效率。文章详细解释了BlockBuilder.Add函数和Finish函数,展示了block的存储布局及其解码恢复过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

前面我们介绍了sstable的存储格式,在介绍sstable时,我们主要关注的是sstable的空间布局,主要是以block为单位。但是具体block里面是怎么存储数据的,我们并没有做过多的介绍。在前面一篇介绍TableBuilder的文章中,我们知道TableBuilder主要是负责生成sstable文件,而且正如我们之前所说,TableBuilder负责的是宏观的sstable生成,具体到数据的存储,它主要还是通过调用Block.Add函数完成。本篇我们将介绍sstable中的block里面具体是怎么存储数据的。主要介绍下面两种类型的block:

  1. data block
  2. index block

data block和index block

通过TableBuilder的Add函数的源代码我们知道,data block和index block都是通过BlockBuilder类来构造的。在向data block和index block中添加数据时,主要是通过调用block builder的Add函数完成:

void BlockBuilder::Add(const Slice& key, const Slice& value)

我们看一下blockBuilder的数据成员:


这里写图片描述

其中options是一个选项,通过它可以设置该block的一些属性。buffer_是一个字符串,我们所谓的向block中添加数据主要就是将数据添加到这个buffer中,而它的上层TableBuilder看到的block也是这个形式。restart_是重启点,也是我们后面介绍的重点。counter_就是一个计数器,last_key就是记录最近加入该block的键值对的key值,finished_是一个标志,通过它可以判断该block是否调用了它的finish函数。

Add函数是核心,我们下面详细分析Add函数,来了解leveldb是怎么在block中存储数据的。


BlockBuilder.Add函数的实现


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值