Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Golang KV存储引擎

Golang实现KV存储引擎实例探究

作者:绍纳 nullbody笔记

这篇文章主要为大家介绍了Golang实现KV存储引擎实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

通过本项目可以学到什么?

WAL预写日志的实现

LSM Tree(Log-Structed-Merge Tree)

如何构架一个企业级的项目

KV数据的序列化和反序列化存储

整个代码量1000多行,基本的大框架也好理解,容易出现错误的点在于代码细节的处理(特别是wal文件的读写部分)

简介

内存数据采用SkipList 存储

通过WAL (Write Ahead Log)保证内存数据durabilitycrash-safe能力

代码逻辑结构

建议从下面 Open Get Put这几个函数开始看起

package main
import (
	"fmt"
	"github.com/gofish2020/easydb"
	"github.com/gofish2020/easydb/utils"
)
// this file shows how to use the basic operations of EasyDB
func main() {
	// specify the options
	options := easydb.DefaultOptions
	options.DirPath = utils.ExecDir() + "/data"
	// open a database
	db, err := easydb.Open(options)
	if err != nil {
		panic(err)
	}
	deferfunc() {
		_ = db.Close()
	}()
	// put a key
	err = db.Put([]byte("name"), []byte("easydb"), nil)
	if err != nil {
		panic(err)
	}
	// get a key
	val, err := db.Get([]byte("name"))
	if err != nil {
		panic(err)
	}
	println(string(val))
	// delete a key
	err = db.Delete([]byte("name"), nil)
	if err != nil {
		panic(err)
	}
	// get a key
	val, err = db.Get([]byte("name"))
	if err != nil {
		if err == easydb.ErrKeyNotFound {
			fmt.Println("key not exist")
			return
		}
		panic(err)
	}
	println(string(val))
}

WAL日志格式

WAL日志文件按照SegmentSize分成一个个的段文件;

每个段文件,按照32KB为一块存储区域,存储 多个 chunk实际数据

每个chunk由 7 字节header + 数据payload 组成;header头包括 4字节校验码,2字节数据长度 1字节数据类型;校验码校验的范围为:【length + type + payload】确保数据没有损坏

一个数据可能由多个chunk组成

当在block中保存了多个chunk后,block剩余的空间不够保存数据,多余的空间浪费掉,填充一些无效字节即可

Ps:本项目主要参考 LotusDB 实现

以上就是Golang实现KV存储引擎实例探究的详细内容,更多关于Golang KV存储引擎的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文