内容简介: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嵌入式数据库。
特点
基于纯Go语言实现,具有优异的跨平台性;
数据库文件采用DRH算法设计,提升对随机数据的操作性能;
数据库单文件设计,对机械硬盘操作更友好,且易于管理维护;
良好的文件IO复用设计,提升对底层数据库文件的操作性能;
提供的基本操作接口:Set()、Get()、Remove();
提供的事务操作接口:Begin()、Commit()、Rollback();
提供的多表操作接口:Table()、SetTo()、GetFrom()、RemoveFrom();
支持原子操作、批量操作、事务操作、多表操作、多表事务、随机遍历等特性;
限制
(默认)表名最长 255B;
(默认)键名最长 255B;
(默认)键值最长 16MB;
(默认)单表数据 1TB;
支持随机遍历,不支持范围遍历;
嵌入式数据库,没有内置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))
文档
【声明】文章转载自:开源中国社区 [http://www.oschina.net]
以上所述就是小编给大家介绍的《gkvdb v1.81 发布,Go 语言嵌入式 K/V 数据库》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。