# 一、为什么会有《自底向上分析boltdb源码》本书?
当初自己尝试学习boltdb时,摸索了很久,一方面网上讲解内部实现的资料少之又少,另一方面很多文章的分析也只是在理论上,自己回头看源码一脸懵逼。
所以在自己入坑折腾了一段时间后,把自己的理解和总结整理了下,方便对这块感兴趣的小伙伴,少走弯路,降低门槛。
# 二、 boltdb是什么?
在用自己的话介绍boltdb之前,我们先看下boltdb官方是如何自我介绍的呢?
> Bolt is a pure Go key/value store inspired by [Howard Chu's][hyc_symas]
[LMDB project][lmdb]. The goal of the project is to provide a simple,
fast, and reliable database for projects that don't require a full database
server such as Postgres or MySQL.
> Since Bolt is meant to be used as such a low-level piece of functionality,
simplicity is key. The API will be small and only focus on getting values
and setting values. That's it.
看完了官方的介绍,接下来让我用一句话对boltdb进行介绍:
**boltdb是一个纯go编写的支持事务的文件型单机kv数据库。**
下面对上述几个核心的关键词进行一一补充。
**纯go:** 意味着该项目只由golang语言开发,不涉及其他语言的调用。因为大部分的数据库基本上都是由c或者c++开发的,boltdb是一款难得的golang编写的数据库。
**支持事务:** boltdb数据库支持两类事务:**读写事务**、**只读事务**。这一点就和其他kv数据库有很大区别。
**文件型:** boltdb所有的数据都是存储在磁盘上的,所以它属于文件型数据库。这里补充一下个人的理解,在某种维度来看,boltdb很像一个简陋版的innodb存储引擎。底层数据都存储在文件上,同时数据都涉及数据在内存和磁盘的转换。但不同的是,innodb在事务上的支持比较强大。
**单机:** boltdb不是分布式数据库,它是一款单机版的数据库。个人认为比较适合的场景是,用来做wal日志或者读多写少的存储场景。
**kv数据库:** boltdb不是sql类型的关系型数据库,它和其他的kv组件类似,对外暴露的是kv的接口,不过boltdb支持的数据类型key和value都是[]byte。
# 三、 为什么要分析boltdb?
前文介绍完了什么是boltdb。那我们先扪心自问一下,为什么要学习、分析boltdb呢?闲的吗?
答案:当然不是。
**首先,我们再补充一些boltdb的背景**
boltdb是纯go写的一个kv数据库,有点类似于简版的innodb存储引擎。支持事务。底层是b+树组织的数据。
主要的用途是做分布式组件的wal(write ahead log),或者单机磁盘型数据存储。
平心而论,对数据库感兴趣的小伙伴,值得一读boltdb的源码。代码量不大。但功能很强大。这个项目还是蛮出名的,现在由etcd团队在维护,同时etcd底层的wal貌似已经换成了boltdb。此外还有其他的一些开源项目在使用,详情可以看boltdb官方的文档说明。etcd维护的组件叫bboltdb,从boltdb fork而来。
**其次,我们再来看看其他几个人对这个问题是如何答复的。**
github用户ZhengHe-MD是这么答复的:
> 要达到好的学习效果,就要有输出。以我平时的工作节奏,在闲暇时间依葫芦画瓢写一个键值数据库不太现实。于是我选择将自己对源码阅读心得系统地记录下来,
> 最终整理成本系列文章,旨在尽我所能正确地描述 boltDB。恰好我在多次尝试在网上寻找相关内容后,发现网上大多数的文章、视频仅仅是介绍 boltDB
> 的用法和特性。因此,也许本系列文章可以作为它们以及 boltDB 官方文档 的补充,帮助想了解它的人更快地、深入地了解 boltDB。
> 如果你和我一样是初学者,相信它对你会有所帮助;如果你是一名经验丰富的数据库工程师,也许本系列文章对你来说没有太多新意。
微信公众号作者TheFutureIsOurs是这么答复的:
[boltdb源码阅读](https://mp.weixin.qq.com/s/QfcHJ7dazjRUSC3vCMuofQ)
> 最近抽时间看了boltdb的源码,代码量不大(大概4000行左右),而且支持事务,结构也很清晰,由于比较稳定,已经归档,确实是学习数据库的最佳选择。
> 而且不少出名的开源项目在使用它,比如etcd,InfluxDB等。
本文记录下笔者在阅读源码后了解到的其工作原理,以留备忘。
下面我来以自身的角度来回答下这个问题:
首先在互联网里面,所有的系统、软件都离不开数据。而提到数据,无非我们就会想到数据的存储和数据检索。这些功能不就是一个数据库最基本的吗。从而数据库在计算机的世界里面
有着无比重要的位置。作为一个有梦想的程序员,总是想知其然并知其所以然。这个是驱动我决定看源码的原因之一。
其次最近在组里高涨的系统学习mysql、redis的氛围下,我也加入了阵营。想着把这两块知识好好消化、整理一番。尤其是mysql,大家主要还是以核心学习innodb存储引擎为目标。本人
也不例外,在我看完了**从跟上理解mysql**后。整体上对innodb有了宏观和微观的了解和认识,但是更近一步去看mysql的代码。有几个难点:1.本人项目主要以golang为主。说实话看
c和c++的项目或多或少有些理解难度;2.mysql作为上古神兽,虽然功能很完善,但是要想短期内看完源码基本上是不可能的,而工作之余的时间有限,因此性价比极低。而boltdb完美的符合了
我的这两个要求。所以这就是选择boltdb的第二个原因,也是一个主要原因。
主要还是想通过分析这个项目,在下面三个方面有所提升。
1. 一方面让自己能加深原先学习的理论知识;
2. 另外一方面也能真正的了解工程上是如何运用的,理论结合实践,然后对存储引擎有一个清晰的认识;
3. 最后也是希望借助这个项目开启个人探索存储方向的大门。
介绍完了学习bolt是什么?为什么要分析boltdb后,我们就正式进入主题了。关于boltdb的源码分析内容较多,所以做成一本电子书。详情可以通过点击下面链接进行阅读。由于个人能力有限,难免有理解和表达不正之处。有问题的地方大家可以第一时间反馈给作者或者在微信群里进行讨论。
# 四、资料汇总
自底向上分析boltdb源码书籍链接
https://jaydenwen123.github.io/boltdb/
自底向上分析boltdb 书籍原仓库地址
https://github.com/jaydenwen123/boltdb_book
boltdb仓库github地址
https://github.com/boltdb/bolt
Boltdb带源码注释仓库地址
https://github.com/jaydenwen123/bolt/tree/jaydenwen123_comment
其他资料可以参考书籍第六章参考资料,有一些是其他大牛的源码分析文章
下面是我们的boltdb微信交流群,有问题、疑问都可以扫码加入群一起交流讨论,二维码过期的话也可以加群管理员或者加微信号`wen2282186474` **学习boltdb**申请入群,邀请入群。
![imgs/boltdb群二维码.jpeg](https://jaydenwen123.github.io/boltdb/imgs/boltdb群二维码.jpeg)
![imgs/群管理微信二维码.jpeg](https://jaydenwen123.github.io/boltdb/imgs/群管理微信二维码.jpeg)
这是一个分享于 的资源,其中的信息可能已经有所发展或是发生改变。
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传