博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Boltdb源码分析(四)----bucket结构
阅读量:4031 次
发布时间:2019-05-24

本文共 2058 字,大约阅读时间需要 6 分钟。

本文公众号文章链接:

本文csdn博客文章链接:

 

 

 

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

前面文章已经讲解了

page结构 

node结构

meta结构

本文分析bucket结构

 

由于bucket和其他很多东西有关联。所以这里有几个概念,把这些结构串起来。

 

 

先是最底层的磁盘文件,其结构为一维结构。最小的管理单位是page,将文件按照page大小分割成块。

 

 

然后将文件对应的page映射到内存中,是这样的一个二维地图。meta是入口,其中有数据的root部分。node是一个树形结构,其中有分支节点,有叶子节点。

然后每个node有着不同的属性,是保持key Value的,还是保持bucket(表头)。

 

 

然后才是bucket结构。boltdb,针对每次的操作(读或写)的事务,都会有一次bucket的探索过程。 

假设我们要去读一个key所对应的Value

先从meta的root中,获取到对应的bucket。然后红色框中,bucket的一个探索过程,是通过游标cursor来寻找的,cursor表示探索的当前位置,直到cursor定位到所在的位置。这里的位置就是node。

 

这里可以很形象的比喻下。

1、磁盘文件就是一个以page为单位块的一维空间。

2、内存中通过page---》node的映射,然后node通过树形结构链接起来,形成了一个二维的树结构。其中meta为特殊的page,为整个数据的入口。

3、现在有了node的树形地图。需要对树进行操作,读或写。就需要来一次探索过程。其中bucket就是一个过程,其中bucket的探索定位是通过游标cursor来实现的。

 

那么下面看代码:

github.com/boltdb/bolt/bucket.go

 

其中

root     pgid   // page id of the bucket's root-level pageroot就是bucket所在的根
tx       *Tx                // the associated transaction事务,每一次对数据库的操作是一次事务,每次事务都是一次探索定位,修改或读取数据过程buckets  map[string]*Bucket // subbucket cache探索过程中,缓存记录下已经探索过的bucketsnodes    map[pgid]*node     // node cache探索过程中,缓存记录下已经探索过的node

 

初始化。这里面只是初始化了tx。

另外这里根据是否是读操作还是写操作,来初始化buckets和nodes

 

github.com/boltdb/bolt/tx.go

 

我们看下如何设置root,这个是tx里面的代码。红色框中,显示了bucket的root是从meta root中获取的。

 

因为bucket是可以嵌套的,也就是说bucket中,不仅仅可以包含key value数据,也可以嵌套包含bucket。

那么下面一步一步分析

github.com/boltdb/bolt/bucket.go

 

要创建一个bucket

1、通过游标进行查找,查找到所对应key的node数据结构。

2、找到了,对应的node结构是不是bucket类型,是则返回,已经存在的err。否则就类型不匹配err

3、没有找到,则创建一个bucket。并将rootnode初始化为isLeaf

其中bucket.write是将bucket结构数据生成page内存数据

4、然后将写入到node中

 

 

这里面就将bucket的头部dump到了page中。

n.write(p)

就是node数据的dump

然后回到函数CreateBucket中

c.node().put(key, key, value, 0, bucketLeafFlag)

这里将bucket所对应的node结构数据放到游标所对应的node中。

 

上面是查找bucket。

1、看看buckets缓存记录中有没有,有,则直接返回

2、通过游标查找定位。

3、判断类型是否匹配

4、查找到后,要做一次转化成bucket。并将其放入到buckets记录缓存中。

5、最后返回

 

以上就是将查找到的value数据转换成bucket类型。

 

以上是对bucket的创建和读取。

下面是对key Value的读写

put写

 

这是设置key Value。还是通过游标查找key所在的node,然后判断node类型,类型不对的话是会返回err的。

最后是将key value写入到node中。

 

Get读

 

直接通过游标查找,这个很简单。

 

 

龚浩华

月牙寂道长

QQ 29185807

2018年04月12日

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

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

 

你可能感兴趣的文章
POJ 2909 Goldbach's Conjecture(我的水题之路——任一数为素数对之和)
查看>>
POJ 2924 Gauß in Elementary School(我的水题之路——n到m的连和)
查看>>
POJ 3006 Dirichlet's Theorem on Arithmetic Progressions(我的水题之路——加i个d后的第几个素数)
查看>>
POJ 3030 Nasty Hacks(我的水题之路——比较大小)
查看>>
POJ 3062 Celebrity jeopardy(我的水题之路——原样输出)
查看>>
POJ 3077 Rounders(我的水题之路——高精度四舍五入)
查看>>
POJ 3086 Triangular Sums(我的水题之路——三角数累加)
查看>>
POJ 3096 Surprising Strings(我的水题之路——重点,D-pairs)
查看>>
POJ 3100 Root of the Problem(我的水题之路——取A^N最接近B的A)
查看>>
POJ 3117 World Cup(我的水题之路——世界杯平局数目)
查看>>
POJ 3158 Kickdown(我的水题之路——齿轮盒子,读题失败)
查看>>
POJ 3183 Stump Removal(我的水题之路——高峰烧火,在线判断)
查看>>
POJ 3224 Go for Lab Cup!(我的水题之路——赢的场数最多)
查看>>
POJ 3300 Tour de France(我的水题之路——车轮角速度最大)
查看>>
POJ 3302 Subsequence(我的水题之路——子串判断)
查看>>
POJ 3325 ICPC Score Totalizer Software(我的水题之路——评委评分)
查看>>
POJ 3386 Halloween Hoildays(我的水题之路——两个戒指)
查看>>
POJ 3427 Ecology tax(我的水题之路——不同的理解,不同的AC)
查看>>
POJ 3438 Look and Say(我的水题之路——N个M的队列)
查看>>
SVN服务器的配置
查看>>