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

栏目: 软件资讯 · 发布时间: 6年前

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

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]


以上所述就是小编给大家介绍的《gkvdb v1.81 发布,Go 语言嵌入式 K/V 数据库》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Parsing Techniques

Parsing Techniques

Dick Grune、Ceriel J.H. Jacobs / Springer / 2010-2-12 / USD 109.00

This second edition of Grune and Jacobs' brilliant work presents new developments and discoveries that have been made in the field. Parsing, also referred to as syntax analysis, has been and continues......一起来看看 《Parsing Techniques》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具