皇上,还记得我吗?我就是1999年那个Linux伊甸园啊-----24小时滚动更新开源资讯,全年无休!

gkvdb v1.81 发布,Go 语言嵌入式 K/V 数据库

gkvdb 自从 v1.0 版本发布以来,作者收到了许多对 gkvdb 感性趣的网友的开发建议和问题反馈,这里非常感谢大家的支持,同时也欢迎感性趣的朋友们一同加入 gkvdb 的开发中来。

本次 v1.81 相对于上一次正式发布的 v1.0 的改动较大,主要在于缓存控制、binlog 支持、事务支持以及多表支持上面,具体改进如下:

v1.50
1、去掉缓存控制接口;
2、增加事务操作支持,调整接口操作以及日志操作单位为事务;
3、在接口层与数据层之间增加 binlog 日志层,作为数据库的缓冲层,提升操作效率;
4、增加异步自动同步线程,当达到一定时间或者一定容量的时候,自动同步 binlog 到底层数据文件;
5、调整 gkvdb 及 gf 包引用地址为 gitee 地址 (#issue IGFYC);
v1.81
1、增加多表支持,将底层数据文件按照数据表的概念进行组织管理;
2、增加多表事务,支持在一个事务中操作多个表,并支持事务提交和回滚;
3、增加对指定表的随机遍历支持;
4、修正文件指针池 IO 复用的并发数据竞争问题 (#issue IGML6);
5、保证 gitee 与 github 的项目实时提交同步;
6、完善项目使用说明;

gkvdb 是 Go 语言开发的基于 DRH(Deep-Re-Hash) 深度哈希分区算法的高性能 Key-Value 嵌入式数据库。

特点

  1. 基于纯 Go 语言实现,具有优异的跨平台性;
  2. 数据库文件采用 DRH 算法设计,提升对随机数据的操作性能;
  3. 数据库单文件设计,对机械硬盘操作更友好,且易于管理维护;
  4. 良好的文件 IO 复用设计,提升对底层数据库文件的操作性能;
  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

使用

1、基本用法

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

2、事务操作

// 开启事务 
tx := db.Begin()

// 事务写入 
tx.Set(key, value)

// 事务查询 
fmt.Println(tx.Get(key))

// 事务提交 
tx.Commit()

// 事务删除 
tx.Remove(key)

// 事务回滚 
tx.Rollback()

3、批量操作

// 批量操作需要使用事务来实现 
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()

4、多表操作

// 创建 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()

5、多表事务

// 两张表 
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))

6、随机遍历

// ======默认 default 表的遍历=====
// 随机获取 10 条数据 
fmt.Println(db.Items(10))

// 获取所有的键值对数据 
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 < 10; i++ {
    key   := []byte("k_" + strconv.Itoa(i))
    value := []byte("v_" + strconv.Itoa(i))
    tu1.Set(key, value)
}
for i := 10; i < 20; i++ {
    key   := []byte("k_" + strconv.Itoa(i))
    value := []byte("v_" + strconv.Itoa(i))
    tu2.Set(key, value)
}

fmt.Println(tu1.Items(-1))
fmt.Println(tu2.Items(-1))

文档

  1. gkvdb 的介绍及设计
  2. gkvdb v1.5 的性能测试及与 leveldb 的性能对比

转自 http://www.oschina.net/news/91250/gkvdb-1-81-released

分享到:更多 ()