学习
实践
活动
工具
TVP
写文章

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

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相对比结构会固定,但内容更多

后续文章再分析吧

龚浩华

月牙寂道长

2018年04月03日

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180403G1G5PB00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券