golang轻量级NoSQL数据库解决方案插件库tiedot的使用
Golang轻量级NoSQL数据库解决方案插件库tiedot的使用
tiedot是一个基于Golang开发的轻量级NoSQL数据库引擎,它使用JSON作为文档格式,支持嵌入式使用或通过HTTP API独立运行。
tiedot简介
tiedot是一个文档型数据库引擎,具有以下特点:
- 使用JSON作为文档格式
- 支持高级集合操作的强大查询处理器
- 可以嵌入到程序中或作为独立服务器运行
- 在*nix和Windows操作系统上运行
- 具有容错数据结构,优先考虑数据安全
- 轻松扩展到4+ CPU核心
tiedot性能非常稳定,即使有数百万条记录!它能持续实现高吞吐量 - 每秒可轻松处理超过12万条记录或8万次复杂查询。
安装和使用示例
基本使用示例
package main
import (
"fmt"
"github.com/HouzuoGuo/tiedot/db"
)
func main() {
// 打开或创建数据库
myDB, err := db.OpenDB("mydatabase")
if err != nil {
panic(err)
}
// 创建集合(相当于表)
if err := myDB.Create("users"); err != nil {
fmt.Println("集合已存在或创建失败:", err)
}
// 获取集合引用
users := myDB.Use("users")
// 插入文档
docID, err := users.Insert(map[string]interface{}{
"name": "John Doe",
"age": 30,
"email": "john@example.com",
})
if err != nil {
panic(err)
}
fmt.Println("插入文档ID:", docID)
// 查询所有文档
var query interface{}
query = map[string]interface{}{
"eq": "John Doe",
"in": []interface{}{"name"},
}
queryResult := make(map[int]struct{}) // 查询结果将放入这个map
if err := db.EvalQuery(query, users, &queryResult); err != nil {
panic(err)
}
// 遍历查询结果
for id := range queryResult {
// 读取文档
readBack, err := users.Read(id)
if err != nil {
panic(err)
}
fmt.Println("查询结果:", readBack)
}
// 关闭数据库
if err := myDB.Close(); err != nil {
panic(err)
}
}
索引操作示例
// 创建索引
if err := users.Index([]string{"name"}); err != nil {
fmt.Println("创建索引失败:", err)
}
// 查询使用索引
queryWithIndex := map[string]interface{}{
"eq": "John Doe",
"in": []interface{}{"name"},
"use": []interface{}{"name"}, // 指定使用name索引
}
queryResult := make(map[int]struct{})
if err := db.EvalQuery(queryWithIndex, users, &queryResult); err != nil {
panic(err)
}
// 删除索引
if err := users.Unindex([]string{"name"}); err != nil {
fmt.Println("删除索引失败:", err)
}
使用HTTP API
tiedot也可以作为独立服务器运行,提供HTTP API:
package main
import (
"github.com/HouzuoGuo/tiedot/embedded"
"log"
)
func main() {
// 启动HTTP服务器,监听8080端口
if err := embedded.StartServer(":8080", "mydatabase"); err != nil {
log.Fatal(err)
}
}
启动后可以通过HTTP API访问数据库:
GET /all
- 列出所有集合POST /create/[collection]
- 创建集合GET /count/[collection]
- 计算集合中的文档数POST /insert/[collection]
- 插入文档GET /get/[collection]/[id]
- 读取文档POST /update/[collection]/[id]
- 更新文档GET /delete/[collection]/[id]
- 删除文档POST /query/[collection]
- 执行查询
注意事项
-
作者在2021年9月指出,该项目自2016年以来一直处于休眠状态,功能集对于现代应用程序来说较为简单,建议考虑其他嵌入式数据库引擎替代方案。
-
tiedot使用Simplified BSD许可证分发。
-
最新版本3.4带来了通用性能和兼容性改进。
Docker运行
可以使用Docker快速运行tiedot:
$ docker-compose build
$ docker-compose up -d
查看日志:
$ docker-compose logs
总结
tiedot是一个轻量级的Golang NoSQL数据库解决方案,适合需要嵌入式JSON数据库的场景。虽然项目目前处于休眠状态,但对于简单的应用场景仍然可以作为一个选择。对于更复杂的需求,建议考虑其他活跃维护的数据库解决方案。
更多关于golang轻量级NoSQL数据库解决方案插件库tiedot的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang轻量级NoSQL数据库解决方案插件库tiedot的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang轻量级NoSQL数据库解决方案:tiedot使用指南
tiedot是一个用纯Go编写的轻量级NoSQL数据库,它提供了类似MongoDB的文档存储功能,但更加轻量且易于集成到Go应用程序中。
tiedot主要特点
- 纯Go实现,无外部依赖
- 支持文档存储和查询
- 提供简单的JSON API
- 支持索引加速查询
- 嵌入式设计,无需单独服务
安装tiedot
go get github.com/HouzuoGuo/tiedot
基本使用示例
1. 创建/打开数据库
package main
import (
"fmt"
"github.com/HouzuoGuo/tiedot/db"
)
func main() {
// 打开或创建数据库
myDB, err := db.OpenDB("mydatabase")
if err != nil {
panic(err)
}
defer myDB.Close()
// 检查数据库是否已存在某个集合
if !myDB.ColExists("users") {
// 创建集合(相当于表)
if err := myDB.Create("users"); err != nil {
panic(err)
}
fmt.Println("集合'users'创建成功")
}
// 获取集合引用
users := myDB.Use("users")
// 其他操作...
}
2. 插入文档
// 插入单个文档
docID, err := users.Insert(map[string]interface{}{
"name": "John Doe",
"age": 30,
"email": "john@example.com",
"active": true,
"hobbies": []string{"reading", "swimming"},
})
if err != nil {
panic(err)
}
fmt.Printf("插入文档ID: %d\n", docID)
// 批量插入
docs := []map[string]interface{}{
{"name": "Alice", "age": 25, "email": "alice@example.com"},
{"name": "Bob", "age": 35, "email": "bob@example.com"},
}
for _, doc := range docs {
if _, err := users.Insert(doc); err != nil {
panic(err)
}
}
3. 查询文档
// 查询所有文档
users.ForEach(func(id int, docContent []byte) bool {
var doc map[string]interface{}
if err := json.Unmarshal(docContent, &doc); err != nil {
fmt.Println("解析文档错误:", err)
return true // 继续迭代
}
fmt.Printf("ID: %d, 内容: %+v\n", id, doc)
return true // 返回false停止迭代
})
// 按ID查询
doc, err := users.Read(docID)
if err != nil {
panic(err)
}
fmt.Printf("按ID查询结果: %+v\n", doc)
4. 创建索引加速查询
// 为name字段创建索引
if err := users.Index([]string{"name"}); err != nil {
panic(err)
}
// 为嵌套字段创建索引
if err := users.Index([]string{"address", "city"}); err != nil {
panic(err)
}
5. 使用索引查询
query := map[string]interface{}{
"eq": "John Doe",
"in": []string{"name"},
}
var result []int
// 执行查询,结果存储在result中
if err := db.EvalQuery(query, users, &result); err != nil {
panic(err)
}
fmt.Println("查询结果IDs:", result)
for _, id := range result {
doc, _ := users.Read(id)
fmt.Printf("ID %d: %+v\n", id, doc)
}
6. 更新和删除文档
// 更新文档
updateData := map[string]interface{}{
"age": 31,
"active": false,
}
if err := users.Update(docID, updateData); err != nil {
panic(err)
}
// 删除文档
if err := users.Delete(docID); err != nil {
panic(err)
}
高级查询示例
tiedot支持多种查询操作符:
// 范围查询
query := map[string]interface{}{
"gt": 25,
"lt": 40,
"in": []string{"age"},
}
// 正则表达式查询
query := map[string]interface{}{
"regex": "Joh.*",
"in": []string{"name"},
}
// 多条件AND查询
query := map[string]interface{}{
"and": []map[string]interface{}{
{"eq": true, "in": []string{"active"}},
{"gt": 25, "in": []string{"age"}},
},
}
// 多条件OR查询
query := map[string]interface{}{
"or": []map[string]interface{}{
{"eq": "Alice", "in": []string{"name"}},
{"eq": "Bob", "in": []string{"name"}},
},
}
性能优化建议
- 为常用查询字段创建索引
- 避免在大型集合上使用无索引查询
- 定期压缩数据库文件(使用
db.Compress
)
限制和注意事项
- tiedot不适合超大规模数据(超过GB级别)
- 不支持分布式或复制功能
- 事务支持有限
- 查询功能不如专业NoSQL数据库丰富
tiedot非常适合小型到中型的Go应用程序,需要嵌入式NoSQL解决方案的场景。对于更复杂的需求,可能需要考虑MongoDB等专业数据库。