tiedot 需显式初始化、路径管理、并发分片配置和 key 规范校验,否则易 panic;必须用绝对路径创建可写目录,分片数不可为0且不可变,文档 key 禁含点号,http 与嵌入模式不兼容,无连接池需复用 db 实例。

Tiedot 可以直接嵌入 Go 程序,但不是“引入即用”的标准库式体验——它需要显式初始化、路径管理、并发控制和错误兜底,否则极易在 db.OpenDB 或 feeds.Insert 阶段 panic。
go get 后必须手动处理目录与权限
运行 go get github.com/HouzuoGuo/tiedot 只下载代码,不自动创建数据目录或校验写入权限。常见错误是传入不可写的路径(如 /etc/mydb)或已存在的非空目录导致 OpenDB 返回 nil 而不报错。
- 始终用
os.MkdirAll(dir, 0755)显式创建目录,而非依赖os.RemoveAll清空(后者在首次运行时会失败) - 避免使用相对路径如
"./data"—— 在 Docker 或 systemd 下工作目录不确定,应改用绝对路径(如"/var/lib/tiedot") - 检查目录是否可写:
os.WriteFile(filepath.Join(dir, ".test"), []byte("x"), 0644),失败则提前退出
Collection 创建必须指定分片数且不能为 0
myDB.Create("Feeds", 2) 中的第二个参数是并发分片数,不是“副本数”或“版本号”。若传 0 或负数,Create 不报错但后续所有操作静默失败;若传 1,则写入完全串行,吞吐量骤降。
在 Golang 中使用 samber/hot 进行内存缓存,支持 LRU、LFU、TinyLFU、W‑TinyLFU、S3FIFO、ARC、TwoQueue、SIEVE、FIFO 等淘汰算法,提供 TTL、缓存加载器及分片功能。
- 生产环境建议设为 CPU 核心数(可用
runtime.NumCPU()动态获取) - 分片数一旦设定无法更改,修改需先
Drop再重建,已有数据丢失 - 不要复用同一 collection 名:重复调用
Create("Feeds", 2)会 panic,应先用myDB.StrCol检查是否存在
Insert 文档必须是 map[string]interface{},且 key 不能含点号
Tiedot 内部用点号(.)做嵌套字段路径分隔符,所以文档顶层 key 若含 .(如 "user.name"),会导致解析异常或字段被截断。这不是 JSON 限制,而是 tiedot 查询引擎的硬约束。
- 插入前用正则过滤 key:
strings.Contains(key, ".")→ 替换为"_"或拒绝 - 值支持
string、int、float64、bool、nil、[]interface{}、map[string]interface{},不支持自定义 struct(需先json.Marshal成 map) -
feeds.Insert返回docID string,不是整数 ID —— 它是内部生成的 UUID-like 字符串,不可预测
HTTP 模式与嵌入模式不可混用,且无连接池抽象
Tiedot 的 HTTP 服务(./tiedot -mode=http)和嵌入式 API 是两套独立实现。试图在嵌入模式下复用 HTTP 客户端的 http.Client 或共享 db.DB 实例,会导致数据不一致或 panic。
- 嵌入模式适合单进程高吞吐场景(如边缘服务),HTTP 模式适合多语言协作但增加延迟和故障点
- 没有类似
sql.DB的连接池机制 —— 每次db.OpenDB都打开新文件句柄,务必复用同一个*db.DB实例 - HTTP 模式默认不启用认证,暴露在公网等于裸奔,必须前置 Nginx 做 Basic Auth 或 IP 白名单
真正麻烦的不是 API 调用,而是它把“数据库可靠性”部分交给了使用者:路径管理、并发分片、key 命名规范、实例生命周期 —— 这些在 SQLite 或 Badger 里由库封装的细节,在 tiedot 里全得自己盯住。稍一松懈,panic: runtime error: invalid memory address 就出现在凌晨三点的日志里。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










