gkvdb 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
gkvdb 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
gkvdb 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 MIT
开发语言 Google Go 查看源码 »
操作系统 跨平台
软件类型 开源软件
开源组织
地区 国产
投 递 者 gqcn
适用人群 未知
收录时间 2017-11-23

软件简介

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

 

 

 

 

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论

点击引领话题📣
发表于数据库专区
2018/02/27 16:47

gkvdb v2.0发布,Go语言Key-Value嵌入式事务数据库

距离上一次gkvdb的1.81版本更新有近3个月的时间了,在这3个月期间gkvdb发生了一些比较大的变化,主要在于性能优化以及高可用设计方面,这些改进使得gkvdb成长得更加成熟稳定。本次版本更新的细节如下: v1.85 1、修正文件碎片管理问题引发的数据遍历问题(#issue IGVJA); 2、增加TODO计划,底层数据文件操作高可用优化功能待完善; v2.00 1、提前完成两项TODO计划(完善底层数据库文件操作高可用设计、文件碎片管理器的性能优化及...

0
12
发表了资讯
2017/12/06 20:54

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

gkvdb自从v1.0版本发布以来,作者收到了许多对gkvdb感性趣的网友的开发建议和问题反馈,这里非常感谢大家的支持,同时也欢迎感性趣的朋友们一同加入gkvdb的开发中来。 本次v1.81相对于上一次正式发布的v1.0的改动较大,主要在于缓存控制、binlog支持、事务支持以及多表支持上面,具体改进如下: v1.50 1、去掉缓存控制接口; 2、增加事务操作支持,调整接口操作以及日志操作单位为事务; 3、在接口层与数据层之间增加binlog日志...

3
13
发表了资讯
2017/11/23 18:06

gkvdb v1.0 正式版发布,Go 语言开发的 KV 嵌入式数据库

gkvdb v1.0正式版发布,本次更新内容如下: 由于针对的是KV键值对存储,底层数据结构从B+树调整为哈希表,并按照DRH(Deep-Re-Hash)深度哈希分区算法进行改进,性能得到极大提升; 不再支持数据范围遍历,取而代之的是随机遍历; 去掉碎片文件,数据库启动时新增碎片检测功能,保证了数据文件空间的充分利用,并提高了数据写入和删除效率,但提高了启动时的时间开销; 新增文件空间整理器,支持对大型碎片进行自动迁移,并自动矫...

4
19
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
暂无内容
0 评论
21 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部