前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Boltdb源码分析(一)-------page结构

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

作者头像
月牙寂道长
发布2019-07-02 11:50:49
7580
发布2019-07-02 11:50:49
举报
文章被收录于专栏:月牙寂月牙寂

版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。golang群:570992072。qq 29185807 个人公众号:月牙寂道长 公众号微信号yueyajidaozhang https://cloud.tencent.com/developer/article/1454431

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

本文csdn博客链接:https://cloud.tencent.com/developer/article/1454431

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格式的数据结构

上面是叶子节点的转换

主要是数组的整个转化0x7FFFFFFFFleafpageElement 类型,

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

pos就是相对的偏移

ksize,key的大小

vsize,value的大小

具体可以看下图结构

分支节点的类似的转化

pos为相对于branchPageElement的偏移位置

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

github.com/boltdb/bolt/db.go

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

后续文章再分析吧

龚浩华

月牙寂道长

QQ 29185807

2018年04月03日

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年04月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档