从零开始----nosql数据库(golang )
数据库的需求
- 需要有索引,快速地找到数据
- 需要满足ACID
学习路线
我们首先不先讲什么理论知识,这些东西对于一点都没有概念的人来说会感觉很抽象。现在的开源社区这么多的项目,这些项目就是很好的学习资源。这里先由我通过分析开源项目的源码,来一步一步剖析原理,编写一个简单的数据库需要什么准备。
nustdb源码分析
https://github.com/xujiajun/nutsdb
这个一个用golang编写的k/v数据库,该仓库的的社区还持续更新着。
我们先把这个repo克隆下来,跟着开源作者的思路来一步一步构建数据库的概念。chekout第一次提交。
git clone https://github.com/xujiajun/nutsdb.git
git checkout 7c0a5b6
那我们就可以看到以下目录结构(将无关的文件忽略掉了),先大概讲下这里的文件的作用
├── bptree.go # 写了一些B+树的操作
├── datafile.go # 写了存放数据文件抽象
├── db.go # 数据库的抽象
├── entry.go # 数据包装
├── options.go # 数据库的配置选项
├── tx.go # 事务的包装
└── utils.go
那么我们知道的了它们的调用关系
options -> db -> tx -> entry -> datafile
-> bptree
在这个commit的文件中,我们可以看到example文件夹,我们选择 example/basic/main.go作为分析的大门。
函数 :db.update()
func put() {
if err := db.Update(
func(tx *nutsdb.Tx) error {
key := []byte("name1")
val := []byte("val1")
if err := tx.Put(bucket, key, val, 0); err != nil {
return err
}
return nil
}); err != nil {
log.Fatal(err)
}
}
函数 :db.Update -> db.managed() ;看到这段代码我 们就大概知道nutsdb数据库写操作时的思路了。看下面的代码注释,主要分为了3步:
- 创建事务
- 预执行
- 提交修改
// managed calls a block of code that is fully contained in a transactio
func (db *DB) managed(writable bool, fn func(tx *Tx