gkvdbGo 語(yǔ)言開(kāi)發(fā)的 Key-Value 嵌入式數(shù)據(jù)庫(kù)
Go語(yǔ)言開(kāi)發(fā)的基于DRH(Deep-Re-Hash)深度哈希分區(qū)算法的高性能高可用Key-Value嵌入式事務(wù)數(shù)據(jù)庫(kù)。
特點(diǎn)
- 基于純Go語(yǔ)言實(shí)現(xiàn),具有優(yōu)異的跨平臺(tái)性;
- 數(shù)據(jù)庫(kù)文件采用DRH算法設(shè)計(jì),提升對(duì)隨機(jī)數(shù)據(jù)的操作性能;
- 數(shù)據(jù)庫(kù)單文件設(shè)計(jì),對(duì)機(jī)械硬盤(pán)操作更友好,且易于管理維護(hù);
- 良好的文件IO復(fù)用設(shè)計(jì),提升對(duì)底層數(shù)據(jù)庫(kù)文件的操作性能;
- 提供的基本操作接口:Set()、Get()、Remove();
- 提供的事務(wù)操作接口:Begin()、Commit()、Rollback();
- 提供的多表操作接口:Table()、SetTo()、GetFrom()、RemoveFrom();
- 支持原子操作、批量操作、事務(wù)操作、多表操作、多表事務(wù)、隨機(jī)遍歷等特性;
限制
- (默認(rèn))表名最長(zhǎng) 255B;
- (默認(rèn))鍵名最長(zhǎng) 255B;
- (默認(rèn))鍵值最長(zhǎng) 16MB;
- (默認(rèn))單表數(shù)據(jù) 1TB;
- 支持隨機(jī)遍歷,不支持范圍遍歷;
- 嵌入式數(shù)據(jù)庫(kù),沒(méi)有內(nèi)置C/S架構(gòu);
安裝
go get -u gitee.com/johng/gf go get -u gitee.com/johng/gkvdb
使用
1、基本用法
import "gitee.com/johng/gkvdb/gkvdb"
// 創(chuàng)建數(shù)據(jù)庫(kù),指定數(shù)據(jù)庫(kù)存放目錄
// gkvdb支持多表,默認(rèn)數(shù)據(jù)表名稱為default
db, err := gkvdb.New("/tmp/gkvdb")
if err != nil {
fmt.Println(err)
}
key := []byte("name")
value := []byte("john")
// 插入數(shù)據(jù)
if err := db.Set(key, value); err != nil {
fmt.Println(err)
}
// 查詢數(shù)據(jù)
fmt.Println(db.Get(key))
// 刪除數(shù)據(jù)
if err := db.Remove(key); err != nil {
fmt.Println(err)
}
// 關(guān)閉數(shù)據(jù)庫(kù)鏈接,讓GC自動(dòng)回收數(shù)據(jù)庫(kù)相關(guān)資源
db.Close()
2、事務(wù)操作
// 開(kāi)啟事務(wù) tx := db.Begin() // 事務(wù)寫(xiě)入 tx.Set(key, value) // 事務(wù)查詢 fmt.Println(tx.Get(key)) // 事務(wù)提交 tx.Commit() // 事務(wù)刪除 tx.Remove(key) // 事務(wù)回滾 tx.Rollback()
3、批量操作
// 批量操作需要使用事務(wù)來(lái)實(shí)現(xiàn) tx := db.Begin() // 批量寫(xiě)入 for i := 0; i4、多表操作
// 創(chuàng)建user表 name := "user" tu, err := db.Table(name) if err != nil { fmt.Println(err) } // user表寫(xiě)入數(shù)據(jù) tu.Set([]byte("user_0"), []byte("name_0")) // user表查詢數(shù)據(jù) fmt.Println(tu.Get([]byte("user_0"))) // user表刪除數(shù)據(jù) tu.Remove([]byte("user_0")) // 通過(guò)db對(duì)象操作user表寫(xiě)入數(shù)據(jù) db.SetTo([]byte("user_1"), []byte("name_1"), name) // 通過(guò)db對(duì)象操作user表查詢數(shù)據(jù) fmt.Println(db.GetFrom([]byte("user_1"), name)) // 通過(guò)db對(duì)象操作user表刪除數(shù)據(jù) db.RemoveFrom([]byte("user_1"), name) // 手動(dòng)關(guān)閉表,釋放表資源 // 一般不用手動(dòng)關(guān)閉,在數(shù)據(jù)庫(kù)關(guān)閉時(shí)會(huì)自動(dòng)關(guān)閉所有的表 tu.Close()5、多表事務(wù)
// 兩張表 name1 := "user1" name2 := "user2" // 創(chuàng)建事務(wù)對(duì)象 tx := db.Begin() // 事務(wù)操作user表寫(xiě)入數(shù)據(jù) tx.SetTo([]byte("user_1"), []byte("name_1"), name1) tx.SetTo([]byte("user_2"), []byte("name_2"), name2) // 事務(wù)操作user表查詢數(shù)據(jù) 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)) // 事務(wù)操作user表刪除數(shù)據(jù) 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))6、隨機(jī)遍歷
// ======默認(rèn)default表的遍歷===== // 隨機(jī)獲取10條數(shù)據(jù) fmt.Println(db.Items(10)) // 獲取所有的鍵值對(duì)數(shù)據(jù) fmt.Println(db.Items(-1)) // 獲取所有的鍵鍵名 fmt.Println(db.Keys(-1)) // 獲取所有的鍵鍵值 fmt.Println(db.Values(-1)) // ======指定表的遍歷===== // 兩張表 name1 := "user1" name2 := "user2" tu1, err := db.Table(name1) if err != nil { fmt.Println(err) } tu2, err := db.Table(name2) if err != nil { fmt.Println(err) } for i := 0; i
評(píng)論
圖片
表情
