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
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