一個 Go 語言實現的數據庫

本篇文章介紹粉絲開源的 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

特性

介紹

一個 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。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/NTUA6czZBwAqRIWwCLrMzg