Golang语言开发的开源NoSQL数据库——TieDot简介

Stella981
• 阅读 371

简介

项目开源地址:https://github.com/HouzuoGuo/tiedot

发起者留下了他的Twitter,貌似姓郭,是个美籍华人

项目简介中,有关于对性能的描述,有人用此数据库抓取了维基百科,保存5900万数据,共73G。

安装

配置好Go环境后,运行

go get github.com/HouzuoGuo/tiedot

入门

使用有2种方式,使用HTTP做接口,适用任何语言;使用嵌入式,使用Go语言,这里介绍使用Go语言,数据库的嵌入模式,足以应付百万请求/天了。

项目自带了演示代码,通过下面的命令执行

./tiedot -mode=example

性能评估命令

./tiedot -mode=bench   # 对40万数据,进行增删改查
./tiedot -mode=bench2  # 还没仔细看

项目中,example.go 文件是Go语言的使用示例

// It is very important to initialize random number generator seed!
    rand.Seed(time.Now().UTC().UnixNano())
    // Create and open database创建并打开数据库
    dir := "/tmp/MyDatabase"
    os.RemoveAll(dir)
    defer os.RemoveAll(dir)

    myDB, err := db.OpenDB(dir)
    if err != nil {
        panic(err)
    }

    // Create two collections Feeds and Votes创建2张表
    // "2" means collection data and indexes are divided into two halves, allowing concurrent access from two threads
    if err := myDB.Create("Feeds", 2); err != nil {
        panic(err)
    }
    if err := myDB.Create("Votes", 2); err != nil {
        panic(err)
    }

    // What collections do I now have?查询都有哪些表
    for name := range myDB.StrCol {
        fmt.Printf("I have a collection called %s\n", name)
    }

    // Rename collection "Votes" to "Points"把表"Votes"重命名为"Points"
    if err := myDB.Rename("Votes", "Points"); err != nil {
        panic(err)
    }

    // Drop (delete) collection "Points"删除表"Points"
    if err := myDB.Drop("Points"); err != nil {
        panic(err)
    }

    // Scrub (repair and compact) "Feeds"修复并压缩表"Feeds"
    myDB.Scrub("Feeds")

    // ****************** Document Management ******************
    // Start using a collection使用表"Feeds"
    feeds := myDB.Use("Feeds")

    // Insert document (document must be map[string]interface{})插入数据
    docID, err := feeds.Insert(map[string]interface{}{
        "name": "Go 1.2 is released",
        "url":  "golang.org"})
    if err != nil {
        panic(err)
    }

    // Read document根据id查询数据
    var readBack interface{}
    feeds.Read(docID, &readBack) // pass in document's physical ID
    fmt.Println(readBack)

    // Update document (document must be map[string]interface{})改数据
    err = feeds.Update(docID, map[string]interface{}{
        "name": "Go is very popular",
        "url":  "google.com"})
    if err != nil {
        panic(err)
    }

    // Delete document删除数据
    feeds.Delete(docID)

    // Delete document
    feeds.Delete(123) // An ID which does not exist does no harm

    // ****************** Index Management ******************索引管理
    // Secondary indexes assist in many types of queries
    // Create index (path leads to document JSON attribute)建索引
    if err := feeds.Index([]string{"author", "name", "first_name"}); err != nil {
        panic(err)
    }
    if err := feeds.Index([]string{"Title"}); err != nil {
        panic(err)
    }
    if err := feeds.Index([]string{"Source"}); err != nil {
        panic(err)
    }

    // What indexes do I have on collection A?查询有哪些索引
    for path := range feeds.SecIndexes {
        fmt.Printf("I have an index on path %s\n", path)
    }

    // Remove index删索引
    if err := feeds.Unindex([]string{"author", "name", "first_name"}); err != nil {
        panic(err)
    }

    // ****************** Queries ******************查询表
    // Let's prepare a number of docments for a start
    feeds.Insert(map[string]interface{}{"Title": "New Go release", "Source": "golang.org", "Age": 3})
    feeds.Insert(map[string]interface{}{"Title": "Kitkat is here", "Source": "google.com", "Age": 2})
    feeds.Insert(map[string]interface{}{"Title": "Good Slackware", "Source": "slackware.com", "Age": 1})

    queryStr := `[{"eq": "New Go release", "in": ["Title"]}, {"eq": "slackware.com", "in": ["Source"]}]`
    var query interface{}
    json.Unmarshal([]byte(queryStr), &query)查询条件

    queryResult := make(map[uint64]struct{}) // query result (document IDs) goes into map keys保存查询结果的变量

    if err := db.EvalQuery(query, feeds, &queryResult); err != nil {执行查询
        panic(err)
    }

    // Query results are physical document IDs打印查询结果
    for id := range queryResult {
        fmt.Printf("Query returned document ID %d\n", id)
    }

    // To use the document itself, simply read it back
    for id := range queryResult {
        feeds.Read(id, &readBack)
        fmt.Printf("Query returned document %v\n", readBack)
    }

    // Gracefully close database关闭数据库
    myDB.Close()
点赞
收藏
评论区
推荐文章
刚刚好 刚刚好
2个月前
css问题
1、 在IOS中图片不显示(给图片加了圆角或者img没有父级) <div<img src""/</div div {width: 20px; height: 20px; borderradius: 20px; overflow: h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
小森森 小森森
2个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本 欢迎添加左边的微信一起探讨!项目地址:](https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n) \2. Bug修复更新日历 2. 情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意), \ \ 和 注意
晴空闲云 晴空闲云
2个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。 盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
1个月前
快速入门|使用MemFire Cloud构建React Native应用程序
> MemFire Cloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Wesley13 Wesley13
1年前
Java爬虫之JSoup使用教程
title: Java爬虫之JSoup使用教程 date: 2018-12-24 8:00:00 +0800 update: 2018-12-24 8:00:00 +0800 author: me cover: [https://img-blog.csdnimg.cn/20181224144920712](https://www.oschin
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置 1、virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid>2220a6d1-a36a-4fbb-8523-e078b3dfe795</uuid>
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Wesley13 Wesley13
1年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表: **时辰** **时间** **24时制** 子时 深夜 11:00 - 凌晨 01:00 23:00 - 01 :00 丑时 上午 01:00 - 上午 03:00 01:00 - 03 :00 寅时 上午 03:00 - 上午 0
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_28799839 helloworld_28799839
2个月前
常用知识整理
# Javascript ## 判断对象是否为空 ```js Object.keys(myObject).length === 0 ``` ## 经常使用的三元运算 > 我们经常遇到处理表格列状态字段如 `status` 的时候可以用到 ``` vue