一个 Go 语言实现的数据库

微信搜索逆锋起笔关注后回复编程pdf
领取编程大佬们所推荐的 23 种编程资料!

本篇文章介绍粉丝开源的 GitHub 项目:rosedb

rosedb 是一个稳定、高性能、快速、内嵌的 k-v 数据库,支持多种数据结构,包含 String、List、Hash、Set、Sorted Set,接口名称风格和 Redis 类似。

rosedb 数据文件布局基于 LSM Tree 和 WAL,纯 Golang 实现,易于使用、扩展。我们的愿景是打造一个高效的 k-v 存储引擎,你可以给我们提任何建议,也请给我们一个 start ✨ 吧,非常感谢!

项目地址:https://github.com/roseduan/rosedb

特性

  • 支持丰富的数据结构:字符串、列表、哈希表、集合、有序集合;

  • 内嵌使用简单至极,无需任何安装部署;

  • 低延迟、高吞吐;

  • 不同数据类型的操作可以完全并行;

  • 支持客户端命令行操作;

  • 支持过期时间;

  • String 数据类型支持前缀和范围扫描;

介绍

一个 rosedb 实例,其实就是系统上的一个文件夹,在这个文件夹中,除了一些配置外,最主要的便是数据文件。一个实例中,只会存在一个活跃的数据文件进行写操作,如果这个文件的大小达到了设置的上限,那么这个文件会被关闭,然后创建一个新的活跃文件。

其余的文件,我称之为已归档文件,这些文件都是已经被关闭,不能在上面进行写操作,但是可以进行读操作。

所以整个数据库实例就是当前活跃文件、已归档文件、其他配置的一个集合:

在每一个文件中,写数据的操作只会追加到文件的末尾,这保证了写操作不会进行额外的磁盘寻址。写入的数据是以一个个被称为 Entry 的结构组织起来的,Entry 的主要数据结构如下:

因此一个数据文件可以看做是多个 Entry 的集合:

当写入数据时,如果是 String 类型,为了支持 string 类型的 key 前缀扫描和范围扫描,我将 key 存放到了跳表中,如果是其他类型的数据,则直接存放至对应的数据结构中。然后将 key、value 等信息,封装成 Entry 持久化到数据文件中。

如果是删除操作,那么也会被封装成一个 Entry,标记其是一个删除操作,然后持久化到数据文件中,这样的话就会带来一个问题,数据文件中可能会存在大量的冗余数据,造成不必要的磁盘空间浪费。为了解决这个问题,我写了一个 reclaim 方法,你可以将其理解为对数据文件进行重新整理,使其变得更加的紧凑。

reclaim 方法的执行流程也比较的简单,首先建立一个临时的文件夹,用于存放临时数据文件。然后遍历整个数据库实例中的所有已归档文件,依次遍历数据文件中的每个 Entry,将有效的 Entry 写到新的临时数据文件中,最后将临时文件拷贝为新的数据文件,原数据文件则删除。

这样便使得数据文件的内容更加紧凑,并且去除了无用的 Entry,避免占据额外的磁盘空间。

开始使用

命令行操作

切换目录到 rosedb/cmd/server,运行 server 目录下的 main.go

打开一个新的窗口,切换目录到 rosedb/cmd/cli,运行目录下的 main.go

内嵌使用

在项目中 import 我的项目:

import "github.com/roseduan/rosedb"

然后打开数据库并执行相应的操作:

package main

import (
  "github.com/roseduan/rosedb"
  "log"
)

func main() {
  config := rosedb.DefaultConfig()
  db, err := rosedb.Open(config)
  
  if err != nil {
    log.Fatal(err)
  }
  
  // 别忘记关闭数据库哦!
  defer db.Close()
  
  //...
}

数据结构

目前 rosedb 支持五种数据结构:StringListHashSetZSet

说明

rosedb 项目代码简洁优雅,注释清晰,用来学习和巩固 Go 语言,是非常不错的项目!作者还在 B 站录制了对应的教学视频,帮助你快速了解项目基本结构以及具体代码实现。

如果你是 k-v 存储爱好者,也可以加入 rosedb ,参与贡献,共同打造一个生产级的 k-v 开源项目!

地址:https://github.com/roseduan/rosedb

逆锋起笔是一个专注于程序员圈子的技术平台,你可以收获最新技术动态最新内测资格BAT等大厂大佬的经验增长自身学习资料职业路线赚钱思维,微信搜索逆锋起笔关注!


推荐阅读

推荐一本免费的 Go 书籍!

一文理解 MySQL 中的 page 页

MySQL 面试题 24 问

数据库有哪些设计技巧

《MySQL性能调优手册》高清电子版,限时免费下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值