gkvdb - Go語言嵌入式數據庫

Go語言開發的基於DRH(Deep-Re-Hash)深度哈希分區算法的高性能高可用Key-Value嵌入式事務數據庫。
gkvdb是開源的,免費的,基於MIT協議進行分發,開源項目地址(gitee與github倉庫保持實時同步):
Gitee( https://gitee.com/johng/gkvdb ),Github( https://github.com/johng-cn/g... )linux

特色

  1. 基於純Go語言實現,具備優異的跨平臺性;
  2. 數據庫文件採用DRH算法設計,提高對隨機數據的操做性能;
  3. 良好的IO複用設計,提高對底層數據庫文件的操做性能;
  4. 良好的高可用設計,保證在任何異常狀況下數據的完整性;
  5. 提供的基本操做接口:Set()、Get()、Remove();
  6. 提供的事務操做接口:Begin()、Commit()、Rollback();
  7. 提供的多表操做接口:Table()、SetTo()、GetFrom()、RemoveFrom();
  8. 支持原子操做、批量操做、事務操做、多表操做、多表事務、隨機遍歷等特性;

限制

  1. (默認)表名最長 255B;
  2. (默認)鍵名最長 255B;
  3. (默認)鍵值最長 16MB;
  4. (默認)單表數據 1TB;
  5. 支持隨機遍歷,不支持範圍遍歷;
  6. 嵌入式數據庫,沒有內置C/S架構;

安裝

go get -u gitee.com/johng/gf
go get -u gitee.com/johng/gkvdb

使用

一、基本用法

import "gitee.com/johng/gkvdb/gkvdb"

// 建立數據庫,指定數據庫存放目錄
// gkvdb支持多表,默認數據表名稱爲default
db, err := gkvdb.New("/tmp/gkvdb")
if err != nil {
    fmt.Println(err)
}

key   := []byte("name")
value := []byte("john")

// 插入數據
if err := db.Set(key, value); err != nil {
    fmt.Println(err)
}

// 查詢數據
fmt.Println(db.Get(key))

// 刪除數據
if err := db.Remove(key); err != nil {
    fmt.Println(err)
}

// 關閉數據庫連接,讓GC自動回收數據庫相關資源
db.Close()

二、事務操做

// 開啓事務
tx := db.Begin()

// 事務寫入
tx.Set(key, value)

// 事務查詢
fmt.Println(tx.Get(key))

// 事務提交
tx.Commit()

// 事務刪除
tx.Remove(key)

// 事務回滾
tx.Rollback()

三、批量操做

// 批量操做須要使用事務來實現
tx := db.Begin()

// 批量寫入
for i := 0; i < 100; i++ {
    key   := []byte("k_" + strconv.Itoa(i))
    value := []byte("v_" + strconv.Itoa(i))
    tx.Set(key, value)
}
tx.Commit()

// 批量刪除
for i := 0; i < 100; i++ {
    key   := []byte("k_" + strconv.Itoa(i))
    tx.Remove(key)
}
tx.Commit()

四、多表操做

// 建立user表
name    := "user"
tu, err := db.Table(name)
if err != nil {
    fmt.Println(err)
}

// user表寫入數據
tu.Set([]byte("user_0"), []byte("name_0"))

// user表查詢數據
fmt.Println(tu.Get([]byte("user_0")))

// user表刪除數據
tu.Remove([]byte("user_0"))

// 經過db對象操做user表寫入數據
db.SetTo([]byte("user_1"), []byte("name_1"), name)

// 經過db對象操做user表查詢數據
fmt.Println(db.GetFrom([]byte("user_1"), name))

// 經過db對象操做user表刪除數據
db.RemoveFrom([]byte("user_1"), name)

// 手動關閉表,釋放表資源
// 通常不用手動關閉,在數據庫關閉時會自動關閉全部的表
tu.Close()

五、多表事務

// 兩張表
name1 := "user1"
name2 := "user2"

// 建立事務對象
tx := db.Begin()

// 事務操做user表寫入數據
tx.SetTo([]byte("user_1"), []byte("name_1"), name1)
tx.SetTo([]byte("user_2"), []byte("name_2"), name2)

// 事務操做user表查詢數據
fmt.Println("tx get1:", tx.GetFrom([]byte("user_1"), name1))
fmt.Println("tx get2:", tx.GetFrom([]byte("user_2"), name2))
tx.Commit()
fmt.Println("db get1:", db.GetFrom([]byte("user_1"), name1))
fmt.Println("db get2:", db.GetFrom([]byte("user_2"), name2))

// 事務操做user表刪除數據
tx.RemoveFrom([]byte("user_1"), name1)
tx.RemoveFrom([]byte("user_2"), name2)
fmt.Println("tx removed1:",tx.GetFrom([]byte("user_1"), name1))
fmt.Println("tx removed2:",tx.GetFrom([]byte("user_2"), name2))

// 刪除操做將被回滾
tx.Rollback()

// 從新查詢
fmt.Println("tx get1:", tx.GetFrom([]byte("user_1"), name1))
fmt.Println("tx get2:", tx.GetFrom([]byte("user_2"), name2))
fmt.Println("db get1:", db.GetFrom([]byte("user_1"), name1))
fmt.Println("db get2:", db.GetFrom([]byte("user_2"), name2))

六、隨機遍歷

// ======默認default表的遍歷=====
// 隨機獲取10條數據
fmt.Println(db.Items(10))

// 獲取全部的鍵值對數據
fmt.Println(db.Items(-1))

// 獲取全部的鍵鍵名
fmt.Println(db.Keys(-1))

// 獲取全部的鍵鍵值
fmt.Println(db.Values(-1))

// ======指定表的遍歷=====
t1, err := db.Table("user1")
if err != nil {
    fmt.Println(err)
}
t2, err := db.Table("user2")
if err != nil {
    fmt.Println(err)
}
for i := 0; i < 10; i++ {
    key   := []byte("k_" + strconv.Itoa(i))
    value := []byte("v_" + strconv.Itoa(i))
    t1.Set(key, value)
}
for i := 10; i < 20; i++ {
    key   := []byte("k_" + strconv.Itoa(i))
    value := []byte("v_" + strconv.Itoa(i))
    t2.Set(key, value)
}

fmt.Println(t1.Items(-1))
fmt.Println(t2.Items(-1))

性能

john@workstation:~/gkvdb/gkvdb_test/benchmark_test$ go test *.go -bench=".*"
goos: linux
goarch: amd64
BenchmarkSet-8            300000          5130 ns/op
BenchmarkGet-8           1000000          9628 ns/op
BenchmarkRemove-8         500000          4053 ns/op
PASS
ok      command-line-arguments    13.964s
相關文章
相關標籤/搜索