大家好,我是何三,独立开发者

RocksDB 是 Facebook 开源的嵌入式存储引擎,C++ 圈子里的"老兵"了。结果最近冒出来一个 Rust 写的项目,叫 FlowDB,Point Query(点查询)直接干到了 600 万 ops/s

RocksDB 呢?54.9 万 ops/s。

差了接近 11 倍

这还是个不到 100 Star 的项目。说实话,我第一反应是:Benchmark 是不是注水了?

FlowDB vs RocksDB Benchmark 对比

仔细看了下,FlowDB 用的是 LSM-tree(日志结构合并树),跟 RocksDB 同一套底层架构。都是 LSM-tree,怎么差距这么大?

这里得先说说 LSM-tree 是什么东西。

大白话时间。

想象你在写日记。传统的 B-tree 就像一本书,每次写完直接翻到对应页码插进去。LSM-tree 的做法不一样:先在小本子上"唰唰唰"记一堆,等小本子写满了,再整批抄到大本子上。这么搞有什么好处?写的时候不用翻来翻去找页码,一顿猛写就完事。

所以 LSM-tree 的写入天生就很快。

问题是读取。你想查一条数据,得从新本子查到旧本子,小本子查到中本子、中本子查到大本子……查得越多越慢。这也是 RocksDB 的瓶颈所在。

LSM-tree 原理:日记比喻

FlowDB 怎么破的?

两个杀手锏。

第一是内存索引优化。 FlowDB 把 Bloom Filter 和索引结构玩出了花——说白了就是——怎么说呢,就是给每个数据块贴了个"有没有你找的东西"的标签。没有直接跳过,不用读盘。RocksDB 也做了这个,但 FlowDB 的内存布局更紧凑,CPU 缓存命中率更高。

第二是 Rust 的零成本抽象。 这个就有点意思了。Rust 没有 GC(垃圾回收),内存管理全在编译期确定。对于数据库这种对延迟极度敏感的场景,GC 的 Stop-The-World 是非常要命的。C++ 也没有 GC,理论上和 Rust 在同一起跑线。但 Rust 的所有权系统让数据在内存中的布局更规整,不会被指针"碎片化"。

说到这个我倒想起了另一个项目。Zig 写的 TigerBeetle,也是做嵌入式存储的,主打金融交易场景,延迟压到微秒级。看来"用新语言重写数据库"这条路是越走越宽了。

跑题了,回来。

继续说 FlowDB 的数据。

除了 Point Query 这个炸裂的 11 倍差距,其他场景也有不错的表现:

  • Prefix Scan(前缀扫描):72K ops/s vs 11K ops/s,快 6 倍多
  • 并发写(8 线程):9.4M ops/s vs 4.7M ops/s,快 2 倍
  • 顺序写:4.5M ops/s vs 3.1M ops/s,快 1.4 倍

为啥 Prefix Scan 差这么多?说实话,这块我也没完全搞懂。RocksDB 其实也做 Prefix Bloom Filter,但可能是 FlowDB 在内存命中率上确实更优。有懂的大佬欢迎指正。

怎么用?

FlowDB 提供的是 Rust 库,直接 cargo add 就能用:

use flowdb::FlowDB;

let db = FlowDB::open("my_data.db")?;

// 写入
db.put("user:1", serde_json::json!({
    "name": "何三",
    "age": 18
}))?;

// 批量查询(快 11 倍的 Point Query)
let user = db.get("user:1")?;

还有更猛的是,FlowDB 内置了 IndexedDB 兼容 API。这意味着什么?你在浏览器里用的 IndexedDB,可以直接用 FlowDB 替换——在 Node.js 或者 Embedded 场景下跑出 6M ops/s 的性能。

浏览器端存储被吐槽慢不是一天两天了。IndexedDB 的 API 设计得又啰嗦又卡,开发者早就怨声载道。FlowDB 直接兼容你写好的 IndexedDB 代码,底层换成 Rust 引擎,速度直接起飞。

装不装都行,看你自己——但如果你在做 IoT、边缘计算或者需要嵌入式存储的桌面应用,这玩意儿真的值得一试。

同类项目方面,RocksDB 是绕不开的对手。但 FlowDB 比 RocksDB 多做了两件事:一是时序数据支持(Time-series),二是原生 JSON 文档存储。RocksDB 是纯粹的 key-value,你要存 JSON,得自己序列化。FlowDB 直接原生支持,serde_json 一把梭。

说了这么多,还是那句话:一个不到 100 Star 的项目,敢在 Benchmark 上跟 RocksDB 硬刚,还赢了。FlowDB 要么是 Benchmark 做了手脚——要么就是 Rust 在嵌入式存储这个赛道上,真的开始发力了。

至于结论,自己判断。

仓库地址:https://github.com/restsend/flowdb

本文使用 MGO 编辑并发布

关注"何三笔记",回复"mgo" 免费下载使用