打开LevelDB的SSTable文件,解析并打印了里面的key-value数据,需要了解SSTable格式的可以看看。
大致解析步骤:
- 先读取尾部的 Footer 信息,Footer 固定为48字节,从 Footer 可以知道 Index block 在文件中偏移
- 解析 Index Block,从 Index Block 可以知道每个 Data Block 在文件中的位置。Index Block的每一项是个key-value结构,value 存的就是对应 Data Block 的位置和大小,而 key 是对应 Data Block 中最大的 key 还大一丁点的 key,比如 Data Block 中最大 key 为 hello,那 Index Block中的 key 就是helloa
- 解析每个 Data Block,得到每个 key-value 对
<?php
$data = file_get_contents('testdb/000009.ldb');
$size = strlen($data);
// footer = meta block handle + index block handle + padding + 8-byte magic number
// footer is fixed 48 byte, parse from this offset
$offset = $size - 48;
// meta block is used for performance, so we can skip parse it
list($metaBlockOffset,$metaBlockSize,$offset) = decodeBlockHandle($offset);
list($idxBlockOffset,$idxBlockSize,$offset) = decodeBlockHandle($offset);
// when parsed one k-v item from index block, this callback function will run
$handleIndexBlockItem = function($key, $seq, $kType, $valBegin, $valLen) {
global $data;
list($datablockOffset,$datablockSize,) = decodeBlockHandle($valBegin);
readBlock($datablockOffset, $datablockSize, function ($key, $seq, $kType, $valBegin, $valLen) {
global $