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