1. XenForo 1.5.14 中文版——支持中文搜索!现已发布!查看详情
  2. Xenforo 爱好者讨论群:215909318 XenForo专区

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

本帖由 漂亮的石头2017-12-07 发布。版面名称:软件资讯

  1. 漂亮的石头

    漂亮的石头 版主 管理成员

    注册:
    2012-02-10
    帖子:
    488,074
    赞:
    47
    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的性能对比
    gkvdb v1.81 发布,Go 语言嵌入式 K/V 数据库下载地址
     
正在加载...