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

本文csdn博客文章链接:https://blog.csdn.net/screscent/article/details/79877103

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

前面文章已经讲解了

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

node结构Boltdb源码分析(二)----node结构

本文分析meta结构


page结构中我们已经见识到了meta是其中的一种结构


要了解meta得从db的初始化开始

github.com/boltdb/bolt/db.go

Boltdb源码分析(三)----meta结构


以上是打开数据文件

Boltdb源码分析(三)----meta结构


文件锁,防止多个操作数据库文件

Boltdb源码分析(三)----meta结构


重点来了,如果文件大小是0的话,说明是一个新的数据库,则进行init。

如果不是0的话,说明是一个已有数据的数据库文件,则进行加载。加载中,加载了第一个pagesize。

Boltdb源码分析(三)----meta结构



接着是对数据库文件进行内存映射mmap。再往下就是freelist的初始化。


到目前我们还不知道meta是什么


那么我们从数据库从0开始init的时候来看

Boltdb源码分析(三)----meta结构


申请了一个4个page的buf。在pgid0,pgid1两个page上面初始化了meta

Boltdb源码分析(三)----meta结构


在pgid2上面初始化了freelist,pgid3上初始化了leafpage。

最后将buf写入文件中,其中offset为0。并将数据同步到了磁盘中。


这里的文件前4个page结构为

Boltdb源码分析(三)----meta结构


下面我们看看meta结构是如何的

Boltdb源码分析(三)----meta结构


这里面看看几个数据的含义

m := p.meta()
m.magic = magic                          魔数,不解释
m.version = version                       版本号
m.pageSize = uint32(db.pageSize) pagesize
m.freelist = 2                                指向freelist的pgid2
m.root = bucket{root: 3} 指向bucket的pgid3
m.pgid = 4                                    正式数据是从pgid4开始的
m.txid = txid(i) 事务***
m.checksum = m.sum64() checksum


再看看如何将meta写入page中的

Boltdb源码分析(三)----meta结构


首先根据事务的id号计算page id

重新计算checksum,然后将meta内容copy到page中


龚浩华

月牙寂道长

QQ 29185807

2018年04月09日

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

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

Boltdb源码分析(三)----meta结构


相关文章:

  • 2021-05-01
  • 2021-11-18
  • 2021-11-18
  • 2021-09-01
  • 2021-08-31
  • 2021-11-08
猜你喜欢
  • 2021-04-03
  • 2021-05-12
  • 2021-12-03
  • 2021-11-01
  • 2021-12-12
  • 2021-10-03
相关资源
相似解决方案