RaftDB 内置了一个高性能、线程安全的嵌入式键值存储引擎。该引擎专为 Raft 状态机设计,经过深度优化,采用 Radix Tree(基数树)作为核心索引结构。
LIMIT/OFFSET 下推优化。摒弃了传统的 Hash Map + Sharding 方案,采用单体 Radix Tree。
user.1, user.2)。WalkPrefix 操作复杂度仅为 O(K),与总数据量无关。LIMIT 下推。一旦扫描满足数量,立即停止 IO 和遍历。测试环境: macOS, 10 并发 Workers, 本地磁盘 IO。
| 操作类型 | 数量 | 耗时 | QPS (Ops/sec) | 提升幅度 (vs Hash版) |
|---|---|---|---|---|
| Insert | 100,000 | ~0.23s | ~436,000 | 9x |
| Update | 10,000 | ~0.04s | ~250,000 | 2.5x |
| Insert (Reuse) | 5,000 | ~0.01s | ~471,000 | 25x |
| Delete | 10,000 | ~0.03s | ~382,000 | 持平 |
| 查询类型 | QPS (Ops/sec) | 说明 |
|---|---|---|
| Point Lookup | ~238,000 | 精确查询 key="..."。受限于 Radix 深度,略低于 Hash 但依然极快。 |
| Meta Query | ~80,000 | 前缀查询 key like "prefix*"。利用 Radix Tree 极速定位子树。提升 33 倍。 |
| Limit Query | ~290,000 | 分页查询 LIMIT 10。利用 Early Termination 立即返回。 |
| Full Query | ~26 | 全表扫描 value like "*..."。受限于单线程 IO 扫描 (优化空间所在)。 |
import "db"
e, err := db.NewEngine("./my_data")
if err != nil { panic(err) }
defer e.Close()
// 极速前缀分页查询
// 引擎会自动识别 "user.*" 前缀,在 Radix Tree 上定位,并只扫描前 20 条
results, _ := e.Query(`key like "user.*" LIMIT 20`)
目前的版本在 Key 操作上已经达到了极致。下一步的优化方向:
ART (Adaptive Radix Tree) 或实现并发安全的 Radix Tree (CoW 或 Fine-grained locks) 以支持更高的并发读。FullTextIndex 深度集成到 Query 流程中,解决 value like 查询慢的问题。