Skip to content

不知道这几个关键词,可能很难读懂源码

nixub edited this page Sep 13, 2024 · 1 revision

文件的结构

表头 表头
H “H:2”代表 H2 数据库
块(block) 最新(不必是最新的)数据块(chunks)的起始块(block)号
块大小(blockSize) 文件块的块大小;当前始终为十六进制1000,即十进制4096,以匹配现代硬盘的磁盘扇区长度。
数据块(chunk) 数据块id,通常与版本号相同;但是,数据块id可能会回滚到0,而版本不会。
created 创建文件时距1970年以来的毫秒数
format 文件格式版本(当前为1)
version 文件版本
fletcher 校验和

来自 https://zhuanlan.zhihu.com/p/613762268

File [ file header 1 ] [ file header 2 ] [ chunk ] [ chunk ] ... [ chunk ]

来自 https://zhuanlan.zhihu.com/p/613762268

2个 Storehead H:2,block:2,blockSize:1000,chunk:7,created:1441235ef73,format:1,version:7,fletcher:3044e6cc

来自 https://zhuanlan.zhihu.com/p/613762268

若干 chunk 数据块 数据块由 block组成机构如 [ header ] [ page ] [ page ] ... [ page ] [ footer ]

来自 https://zhuanlan.zhihu.com/p/613762268 chunk header chunk:1,block:2,len:1,map:6,max:1c0,next:3,pages:2,root:4000004f8c,time:1fc,version:1 chunk footer chunk:1,block:2,version:1,fletcher:aed9a4f6

来自 https://zhuanlan.zhihu.com/p/613762268 | 表头 | 表头 |

chunk chunk的ID
block chunk的第一个block的编号(乘以block大小可以得到文件中的位置)
len chunk包含的页面 (page)数
map 最新map的ID,每次创建新map时递增
max chunk中页面(page)的最大数量
pages chunk中页面(page)的数量
next 下一个chunk的ID
root 元数据根页面(page)的位置
time chunk被写入的时间,从文件创建后的毫秒数开始计算
version chunk的版本号

来自 https://zhuanlan.zhihu.com/p/613762268

页面格式(Page Format) 每个Map都是一棵B树,Map数据存储在(B树)页面中。页面(page)分为叶子页面和内部节点页面。叶子页面包含Map的键值对,而内部节点只包含键和指向叶子页面的指针。树的根节点可以是叶子页面或内部节点。不同于文件头,数据块 header和 foot 的数据,页面数据是存储为字节数组的,其中包含长整型(8个字节)、整型(4个字节)、短整型(2个字节)和可变大小的整型和长整型(1到5/10个字节)。 页面格式的参数

length 页面的字节数
checksum 计算方法为 chunk id 异或 page 在 chunk 中的偏移量 offset 异或 page 大小。
mapId 该页面所属 map 的 ID
len 该页面中 key 的数量。
type (byte) 页面的类型。叶节点:0。内部节点:1。
children 子节点位置 (long 类型数组;仅仅是内部节点)
childCounts Child 页面的数量
keys (字节数组)数组存储了该节点的所有键,类型取决于数据类型
values (字节数组)(仅适用于叶子节点)存储了该节点的所有值,类型取决于数据类型

来自 https://zhuanlan.zhihu.com/p/613762268