Boltdb源码分析(一)-------page结构
本文公众号文章链接:https://mp.weixin.qq.com/s/YoRJw_vkAK0aBTN6-HK0qw
本文****博客链接:https://blog.****.net/screscent/article/details/79807625
boltdb是一个纯粹的key Value数据库,其宗旨是提供一个简单,快速,可信的数据库。此数据库广泛应用于各大开源组件中。
源码目录为:
源码比较多,且其内部逻辑比较复杂,本文只分析其中的page结构。
github.com/boltdb/bolt/page.go
page结构体。page指的是内存中的页,这个结构体其实是用来对应页,然后将其管理起来的数据结构。
id:是pgid类型,是给page的编号。
flags:是指的此页中保存的具体数据类型。(有好几种)
count:记录具体数据类型中的计数,不同的类型具有不同的含义
overflow:用来记录是否有跨页
ptr:是具体的数据类型。这种用法让我想起来了c语言中的用法。在Linux内核中经常用到。比如典型的场景就是虚拟文件系统的接口。
这个是具体的数据类型。上面写的有4种。
branchPageFlag:分支节点
leafPageFlag:叶子节点
以上是用树结构来管理页的关系
metaPageFlag:meta页
freelistPageFlag:freelist页(这个以后文章再说吧)
上面的pageHeaderSize很难解释。还是画图来看吧。
从上面的图就可以很直接的看到了。page的头部包含了一些信息,最后的ptr是具体的数据结构。
获取到meta格式的数据结构
上面是叶子节点的转换
主要是数组的整个转化[0x7FFFFFFFF]leafpageElement 类型,
指针是p.ptr,返回了数组转化后的[:]
pos就是相对的偏移
ksize,key的大小
vsize,value的大小
具体可以看下图结构
分支节点的类似的转化
pos为相对于branchPageElement的偏移位置
看下这个具体的内存分布结构图
github.com/boltdb/bolt/db.go
meta相对比结构会固定,但内容更多
后续文章再分析吧
龚浩华
月牙寂道长
QQ 29185807
2018年04月03日
如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。
第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注