-
Notifications
You must be signed in to change notification settings - Fork 0
不知道这几个关键词,可能很难读懂源码
文件的结构
表头 | 表头 |
---|---|
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 | (字节数组)(仅适用于叶子节点)存储了该节点的所有值,类型取决于数据类型 |