从零开始----nosql数据库(golang )

本文从数据库需求出发,探讨编写NoSQL数据库的必要条件,如索引和ACID属性。通过分析Golang编写的nustdb源码,逐步揭示数据库构建的基本步骤,包括事务处理、数据写入等关键环节。总结了编写数据库所需的基础知识,如索引数据结构,并展望了未来优化方向,如并发ACID支持和存储效率提升。
摘要由CSDN通过智能技术生成

从零开始----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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值