page
page是B+树中一个具体的页面表示,BoltDB中,page的大小默认为操作系统默认页面大小, page按照具体存储的数据可以分成不同的类型,其中有:branchPage(B+树中非叶子节点), leafPage(B+树叶子节点),metaPage(存储原数据的page),freeListPage(存储当前空闲页面ID的page);
type page struct {
id pgid //当前page对应的pageId
flags uint16 //page所代表的page类型
count uint16 //当前page所存储的元素的个数
overflow uint32 //如果某次数据一个page不能容纳下,则会分配多个连续的page来存储,代表几个连续的page
ptr uintptr //指向实际存储的数据
}
不同的page类型,ptr所指向的内容不同,相应的页面布局也不同,不同页面所存储的内容和页面布局如下所示:
meta page
//meta页面包含两个,位置固定为pageid=1和pageid=2 (为啥这两个页面要固定?for failover? 崩溃恢复的时候能够快速
//通过这两个页面中的信息恢复数据库信息?)
//meta页面存储了当前db的一些原数据信息,其中包括:魔数,版本号,页面大小,root节点
//空闲页面id对应的页面id(空闲页面id对应的页面id是会变换的),当前页面对应的页面id,当前对应的最大事务id,
//校验和等等
type meta struct {
magic uint32
version uint32
pageSize uint32
flags uint32
root bucket
freelist pgid
pgid pgid
txid txid
checksum uint64
}
branchPage
//branchPageElement代表一个在branch page中的节点
type branchPageElement struct {
pos uint32
ksize uint32 //当前元素的key的长度
pgid pgid //对其element对应的pageId
}
branchPage由branchPageElement头和具体的key组成,页面布局如下:
leafPage
//leafPageElement代表一个在叶子节点中的元素
type leafPageElement struct {
flags uint32 //todo
pos uint32 //相对于ptr的偏移量
ksize uint32 //key的长度
vsize uint32 //value的长度
}
leafPage具体由leafPageElement头和具体的key/value组成,其中具体页面布局如下: