boltdb page页面布局详解

307 阅读2分钟

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
}

metaPage

branchPage

//branchPageElement代表一个在branch page中的节点
type branchPageElement struct {
	pos   uint32
	ksize uint32 //当前元素的key的长度
	pgid  pgid   //对其element对应的pageId
}

branchPage由branchPageElement头和具体的key组成,页面布局如下:

branchPage

leafPage

//leafPageElement代表一个在叶子节点中的元素
type leafPageElement struct {
	flags uint32 //todo
	pos   uint32 //相对于ptr的偏移量
	ksize uint32 //key的长度
	vsize uint32 //value的长度
}

leafPage具体由leafPageElement头和具体的key/value组成,其中具体页面布局如下:

leafPage