RaftDB 内置了一个高性能、线程安全的嵌入式键值存储引擎。该引擎专为 Raft 状态机设计,经过深度优化,采用 Flat Sorted Array (有序扁平数组) 作为核心索引结构,并结合了 倒排索引 (Inverted Index) 以支持极速全文/模糊检索。
value like 查询引入倒排索引,性能提升 20倍。LIMIT/OFFSET 下推,扫描满足即停止。摒弃了传统的 Hash Map 或 Tree 结构,采用极致内存优化的 Flat Sorted Array。
[]byte 大数组中,无 Go String Header 开销。Offset(4B) + Len(2B) + Metadata,并在内存中保持有序。针对 value like "*token*" 等模糊查询场景,引擎维护了一个轻量级的倒排索引 (Token -> Keys)。
WriteAt 写入操作系统 Page Cache。fsync。若发生操作系统崩溃或断电,最近写入的数据(尚未刷盘部分)将会丢失。
Sync(),但这会显著降低写入吞吐量(从 40w QPS 降至磁盘 IOPS 极限)。Scan 会验证 CRC。Scan 会自动截断丢弃,保证一致性。Scan 会在错误处停止,导致该点之后的所有数据不可见。这是一种“宁缺毋滥”的牺牲可用性保一致性的策略。Set 操作通过互斥锁串行化,保证了写入线性一致。Query 并不阻塞 Set 的日志写入,但在读取索引时持有 RLock。这可能导致短暂的“幻读”或可见性延迟,但不会导致数据错乱。Query 在遍历索引时(持有 RLock)会进行磁盘 I/O (ReadValue)。RLock 会阻塞所有试图获取 Lock 的 Set 操作(写阻塞)。在慢磁盘或高并发读场景下,写入延迟可能显著增加。测试环境: macOS, 10 并发 Workers, 本地磁盘 IO。
| 操作类型 | 数量 | 耗时 | QPS (Ops/sec) | 说明 |
|---|---|---|---|---|
| Insert | 100,000 | ~0.25s | ~399,000 | 写入性能极强 |
| Insert (Reuse) | 5,000 | ~0.01s | ~560,000 | 空间复用路径极快 |
| Update | 10,000 | ~0.04s | ~252,000 | 原地更新优化生效 |
| Delete | 10,000 | ~0.02s | ~420,000 | 标记删除 |
| 查询类型 | QPS (Ops/sec) | 提升幅度 | 说明 |
|---|---|---|---|
| Point Lookup | ~228,000 | - | 基准性能,极快。 |
| Meta Query | ~78,000 | 2x (vs SkipList) | 前缀查询 key like "prefix*"。有序数组二分查找优势。 |
| Limit Query | ~287,000 | 1.6x (vs SkipList) | LIMIT 下推优化,扫描极少数据即返回。 |
| Full Scan (Val) | ~581 | 21.5x (vs Scan) | 倒排索引生效。从全表 IO 扫描变为内存索引查找。 |
| 场景 | 内存占用 (10w Keys) | 说明 |
|---|---|---|
| 仅核心索引 (Key Only) | 5.46 MB | Flat Sorted Array 生效。仅 ~55字节/Key (含Go Runtime开销),极其紧凑。 |
| 开启全文索引 (With Value Index) | 73.93 MB | 倒排索引 (Token -> Keys) 占用主要内存,以空间换取 20x 查询性能。 |
本数据库引擎本身被设计为一个实时的持久化状态机。
values.data) 加上内存索引,随时代表了某个 LastCommitIndex 处的一致性快照。CommitIndex。Snapshot 接口生成全量数据镜像。// 生成全量快照二进制流
data, err := e.Snapshot()
[Count U64] + [Record...]
[KeyLen U16][Key][ValLen U32][Value][CommitIndex U64]// 从快照恢复状态
err := e.Restore(data)
values.data) 和元数据文件 (meta.state)。LastCommitIndex 到最新状态。meta.state 文件专门记录 LastCommitIndex,不再依赖全盘扫描,实现秒级重启。LastCommitIndex,自动忽略已 Apply 的 Raft Log,防止重放攻击或重复写入。meta.state。LastCommitIndex。