v0.7.0

架構

最後更新

本頁說明 ToriiDB 各層如何組合:socket daemon、內嵌 store、各資料庫狀態、持久化與 embedding client。

系統總覽

graph TB
    APP[應用程式 process] --> NEW["daemon.New(dir)"]
    NEW -->|socket 有回應| CLI[ModeClient:連線池 unix socket client]
    NEW -->|無存活 socket| SRV[ModeServer:持有 store.Store]
    CLI -->|4-byte 長度 + JSON frame| SOCK["/tmp/toriidb-uid-hash.sock"]
    SOCK --> DISP["dispatch:Session() + Select(db)"]
    SRV --> DISP
    REPL[cmd/test REPL] --> EXEC["Store.Exec 指令路由"]
    DISP --> CORE[store core:KV、JSON 欄位、TTL、掃描、向量]
    EXEC --> CORE
    CORE --> DBS["db_0 ... db_15:RWMutex + Entry map"]
    DBS --> DISK["NNNNNNNN.snap + NNNNNNNN.log 世代"]
    CORE --> EMB["openai.Client (text-embedding-3-small)"]
    EMB --> CACHE["__torii:embed:* 快取項目"]
    CACHE --> DBS

分層

層 原始碼 職責
Socket daemon core/daemon/daemon.go、socket.go 每個資料目錄一個 server;同目錄後續的 New 皆成為 client
傳輸協定 core/daemon/protocol.go、client.go、handler.go 長度前綴 JSON frame、連線池、op 分派、錯誤種類
指令路由 core/store/exec.go 為 REPL 與 Exec 呼叫端解析 Redis 風格文字指令
Store 生命週期 core/store/store.go 16 個延遲載入資料庫、session、過期計時器、關閉時壓縮
Entry 引擎 core/store/set.go、get.go、setField.go、del.go、incr*.go、ttl.go 型別偵測、JSON 欄位修改、TTL、解析快取不變條件
掃描 core/store/keys.go、find.go、query.go、filter/ glob 鍵列舉、值比較、JSON 篩選運算式
持久化 core/store/aof.go、gc.go 附加 + fsync、snapshot 壓縮、世代退回、垃圾回收
向量 core/store/vector.go、vcache.go、vsearch.go、vsim.go、core/openai/client.go Embedding、快取、餘弦 Top-K 搜尋

跨切原則

原則 體現位置
Socket 身分只由位置決定 resolveDir 依序 CheckDir → filepath.Abs → filepath.EvalSymlinks;socket 固定放 /tmp,不讀 $TMPDIR
呼叫端不需判斷模式 Daemon 只有一組方法;server 模式行程內分派,client 模式送 frame
每個請求彼此隔離 daemon 每個請求建立自己的 Session 並 Select 資料庫,因為選定索引是無鎖 int
記憶體為準、磁碟可重播 寫入先更新 map,再附加一行並 sync;啟動時重播 snapshot + log
破壞性覆寫受保護 重播失敗時拒絕壓縮;壓縮成功後才回收舊世代
內部鍵不外洩 KEYS、FIND、QUERY、VSEARCH 跳過 __torii:*;點查詢仍可讀

延伸閱讀

EN