RoseDB V2 版本發(fā)布!你發(fā)現(xiàn)了什么?
RoseDB V2 重構(gòu)的第一個版本發(fā)布了!
RoseDB 是一個基于 Bitcask 存儲模型,輕量、快速、可靠的 KV 存儲引擎。Bitcask 存儲模型的設(shè)計主要受到日志結(jié)構(gòu)化的文件系統(tǒng)和日志文件合并的啟發(fā)。
感興趣可參考 Bitcask 論文:https://riak.com/assets/bitcask-intro.pdf
RoseDB 存儲數(shù)據(jù)的文件使用預寫日志(Write Ahead Log)進行了重新設(shè)計,這些日志文件是具有 block 緩存的只追加寫入(append-only)文件。
wal: https://github.com/rosedblabs/wal
我將原來 rosedb 中的 Redis 數(shù)據(jù)結(jié)構(gòu)和協(xié)議拆分了出去,后面會單獨形成一個項目,方便接入不同的存儲引擎,比如 rosedb、badger、pebble、levledb 等等。
所以 rosedb 只專注于單機存儲引擎的功能,目前處于積極維護狀態(tài),歡迎大家 issue 或者貢獻,點點 start ??。
項目地址:https://github.com/rosedblabs/rosedb
以下是 RoseDB 的一些簡單介紹和使用示例:
主要特點
優(yōu)勢
讀寫低延遲
這是由于 Bitcask 存儲模型文件的追加寫入特性,充分利用順序 IO 的優(yōu)勢。高吞吐量,即使數(shù)據(jù)完全無序
寫入 RoseDB 的數(shù)據(jù)不需要在磁盤上排序,Bitcask 的日志結(jié)構(gòu)文件設(shè)計在寫入過程中減少了磁盤磁頭的移動。
能夠處理大于內(nèi)存的數(shù)據(jù)集,性能穩(wěn)定
RoseDB 的數(shù)據(jù)訪問涉及對內(nèi)存中的索引數(shù)據(jù)結(jié)構(gòu)進行直接查找,這使得即使數(shù)據(jù)集非常大,查找數(shù)據(jù)也非常高效。
一次磁盤 IO 可以獲取任意鍵值對
RoseDB 的內(nèi)存索引數(shù)據(jù)結(jié)構(gòu)直接指向數(shù)據(jù)所在的磁盤位置,不需要多次磁盤尋址來讀取一個值,有時甚至不需要尋址,這歸功于操作系統(tǒng)的文件系統(tǒng)緩存以及 WAL 的 block 緩存。
性能快速穩(wěn)定
RoseDB 寫入操作最多需要一次對當前打開文件的尾部的尋址,然后進行追加寫入,寫入后會更新內(nèi)存。這個流程不會受到數(shù)據(jù)庫數(shù)據(jù)量大小的影響,因此性能穩(wěn)定。
崩潰恢復快速
使用 RoseDB 的崩潰恢復很容易也很快,因為 RoseDB 文件是只追加寫入一次的?;謴筒僮餍枰獧z查記錄并驗證CRC數(shù)據(jù),以確保數(shù)據(jù)一致。
備份簡單
在大多數(shù)系統(tǒng)中,備份可能非常復雜。RoseDB 通過其只追加寫入一次的磁盤格式簡化了此過程。任何按磁盤塊順序存檔或復制文件的工具都將正確備份或復制 RoseDB 數(shù)據(jù)庫。
批處理操作可以保證原子性、一致性和持久性
RoseDB 支持批處理操作,這些操作是原子、一致和持久的。批處理中的新寫入操作在提交之前被緩存在內(nèi)存中。如果批處理成功提交,批處理中的所有寫入操作將持久保存到磁盤。如果批處理失敗,批處理中的所有寫入操作將被丟棄。即一個批處理操作中的所有寫入操作要么全部成功,要么全部失敗。
缺點
所有的 key 必須在內(nèi)存中維護
RoseDB 始終將所有 key 保留在內(nèi)存中,這意味著您的系統(tǒng)必須具有足夠的內(nèi)存來容納所有的 key。
快速上手
基本操作
package main
import "github.com/rosedblabs/rosedb/v2"
func main() {
// 指定選項
options := rosedb.DefaultOptions
options.DirPath = "/tmp/rosedb_basic"
// 打開數(shù)據(jù)庫
db, err := rosedb.Open(options)
if err != nil {
panic(err)
}
defer func() {
_ = db.Close()
}()
// 設(shè)置鍵值對
err = db.Put([]byte("name"), []byte("rosedb"))
if err != nil {
panic(err)
}
// 獲取鍵值對
val, err := db.Get([]byte("name"))
if err != nil {
panic(err)
}
println(string(val))
// 刪除鍵值對
err = db.Delete([]byte("name"))
if err != nil {
panic(err)
}
}
批處理操作
// 創(chuàng)建批處理
batch := db.NewBatch(rosedb.DefaultBatchOptions)
// 設(shè)置鍵值對
_ = batch.Put([]byte("name"), []byte("rosedb"))
// 獲取鍵值對
val, _ := batch.Get([]byte("name"))
println(string(val))
// 刪除鍵值對
_ = batch.Delete([]byte("name"))
// 提交批處理
_ = batch.Commit()
完整代碼可查看 examples 示例代碼。