[Golang]K-V存储引擎的学习 从零实现 (RoseDB mini版本)

本文介绍了作者基于mini-bitcask实现的k-v存储引擎,涉及数据在内存和磁盘的存储结构、LSM技术,以及代码中的主要功能如数据操作(PUT,GET,DELETE)和文件操作。作者还分享了项目结构和关键代码段,如DBFile和Entry的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目的简单介绍

mini-bitcask的学习,从零实现一个k-v存储引擎
原项目的github地址,感谢Rose大佬
mini-bitcaskrosedbmini版本,博主借此了解k-v存储,该项目通过对一个数据文件进行读写以进行简单示意,而非rosedb多个数据文件的机制,这里也提供rosedb的github地址

详情

此处为rose大佬提供的项目的相关知识的介绍,可供查阅

简而言之的话,minidb设计了数据在内存、磁盘二者中的存放,使用类似LSM的存储结构。
实现了数据PUT、GET、DELETE的功能
核心思想为利用顺序IO来提升性能。

代码分析

这里博主为了学习,由于原main.go固定流程,将其改为可自定义的流程,这里附学习项目的github地址,只对main.go进行了修改,并将数据文件的地址改到项目根目录中。

项目结构

.
├── db_file.go
├── db.go
├── db_test.go
├── entry.go
├── errors.go
├── example
│   └── main.go
├── go.mod
├── minidb.iml
└── README.md

接下来对主要部分进行注释和分析
db_file.go

db.go

定义了MiniBitcask结构体,index使用map在内存中进行key-value的存储,dbfile和dirpath是数据文件的相关信息,mu则用来进行并发的保护

type MiniBitcask struct {
   
	indexes map[string]int64 // 内存中的索引信息
	dbFile  *DBFile          // 数据文件
	dirPath string           // 数据目录
	mu      sync.RWMutex
}

db.go主要功能为提供数据库的集成功能创建数据库实例OPEN

实现方法写入数据PUT、取出数据GET、删除数据DEL、合并数据文件merge、关闭db实例CLOSE,也是我们主要使用的功能

实现过程从内存中获取索引exist从数据文件加载索引loadIndexesFromFile

这一部分在原文和源文件中就有代码的分析,这里不再赘述

db_file.go

该部分有关数据文件定义
DBFile结构体包括对应数据文件的句柄,以及下次写入的偏移量、

// DBFile 数据文件定义
type DBFile struct {
   
	File          *os.File
	Offset        int64
	HeaderBufPool *sync.Pool
}

newInternal函数创建一个DBFile实例NewDBFile创建一个新的数据文件NewMergeDBFile新建一个合并时的数据文件

func newInternal(fileName string) (*DBFile
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值