Boltdb源码分析(一)-------page结构

本文公众号文章链接:https://mp.weixin.qq.com/s/YoRJw_vkAK0aBTN6-HK0qw

本文****博客链接:https://blog.****.net/screscent/article/details/79807625


boltdb是一个纯粹的key Value数据库,其宗旨是提供一个简单,快速,可信的数据库。此数据库广泛应用于各大开源组件中。


源码目录为:

Boltdb源码分析(一)-------page结构


源码比较多,且其内部逻辑比较复杂,本文只分析其中的page结构。


github.com/boltdb/bolt/page.go

Boltdb源码分析(一)-------page结构

page结构体。page指的是内存中的页,这个结构体其实是用来对应页,然后将其管理起来的数据结构。

id:是pgid类型,是给page的编号。

flags:是指的此页中保存的具体数据类型。(有好几种)

count:记录具体数据类型中的计数,不同的类型具有不同的含义

overflow:用来记录是否有跨页

ptr:是具体的数据类型。这种用法让我想起来了c语言中的用法。在Linux内核中经常用到。比如典型的场景就是虚拟文件系统的接口。

Boltdb源码分析(一)-------page结构


Boltdb源码分析(一)-------page结构


这个是具体的数据类型。上面写的有4种。

branchPageFlag:分支节点

leafPageFlag:叶子节点

以上是用树结构来管理页的关系

metaPageFlag:meta页

freelistPageFlag:freelist页(这个以后文章再说吧)

Boltdb源码分析(一)-------page结构


上面的pageHeaderSize很难解释。还是画图来看吧。

Boltdb源码分析(一)-------page结构


从上面的图就可以很直接的看到了。page的头部包含了一些信息,最后的ptr是具体的数据结构。

Boltdb源码分析(一)-------page结构



获取到meta格式的数据结构

Boltdb源码分析(一)-------page结构


上面是叶子节点的转换

主要是数组的整个转化[0x7FFFFFFFF]leafpageElement 类型,

指针是p.ptr,返回了数组转化后的[:]

Boltdb源码分析(一)-------page结构


pos就是相对的偏移

ksize,key的大小

vsize,value的大小

具体可以看下图结构

Boltdb源码分析(一)-------page结构

Boltdb源码分析(一)-------page结构



分支节点的类似的转化

Boltdb源码分析(一)-------page结构



pos为相对于branchPageElement的偏移位置

看下这个具体的内存分布结构图

Boltdb源码分析(一)-------page结构





github.com/boltdb/bolt/db.go


Boltdb源码分析(一)-------page结构

meta相对比结构会固定,但内容更多

后续文章再分析吧



龚浩华

月牙寂道长

QQ 29185807

2018年04月03日

如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。

第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注

Boltdb源码分析(一)-------page结构