不想再挂 Postgres / MySQL 时,常用嵌入式(进程内)数据库。按 SQL 和 KV 分开看。
SQL:SQLite
需要表、JOIN、索引、迁移、ORM 时,优先 SQLite。差别主要在 访问方式。
| Crate | 异步 | 绑定方式 | 核心亮点 | 主要短板 | 适合 |
|---|---|---|---|---|---|
| rusqlite | 否 | 绑 SQLite(可 bundled) | SQLite 官方感 API、功能全、部署可静态编进二进制 | 同步;Web 服务要自己丢线程池 | CLI / 桌面 / 嵌入式默认首选 |
| sqlx(sqlite) | 是 | 绑 SQLite(可 bundled) | 异步、编译期查 SQL、raw SQL 友好 | 和 rusqlite 同项目可能撞 libsqlite3-sys 版本 | Tokio 服务、要 compile-time check |
| diesel(sqlite) | 否(异步需额外) | 绑 SQLite | 成熟 ORM、类型安全 DSL | 学习曲线、迁移偏「Diesel 风格」 | 长期项目、强类型 schema |
| SeaORM(sqlite) | 是 | 经 sqlx 等 | 动态 ORM、关系处理顺手 | 抽象层更厚 | 习惯传统 ORM 的团队 |
实务上:纯 SQLite、同步场景用 rusqlite(开 bundled);异步服务用 sqlx;要完整 ORM 再看 Diesel / SeaORM。
KV:Rust 嵌入式
只要 key → value、自己管序列化 / 索引时,KV 更轻。
| 库 | 结构 | 纯 Rust | 事务 | 核心亮点 | 主要短板 | 适合 |
|---|---|---|---|---|---|---|
| redb | B+ tree(CoW) | 是 | ACID | 单文件、API 清爽、活跃维护;新项目默认 | 极端写吞吐不如顶尖 LSM | 通用嵌入式 KV、读多写少 |
| sled | 类 LSM / 混合 | 是 | 可序列化事务 | 曾是社区热门、API 像并发 BTreeMap | 维护模式 / 偏 beta,新项目不推荐 | 遗留代码 |
| fjall | LSM | 是 | 支持 | 纯 Rust LSM、批量写表现好 | 生态比 RocksDB 小 | 要纯 Rust 的写密集存储 |
| heed(LMDB) | B+ tree | 否(绑 LMDB) | ACID,多进程读友好 | 读极快、多进程、久经考验 | 写扩容 / 环境变量调参有坑 | 读多、多进程、信任 LMDB |
| rocksdb(rust 绑定) | LSM | 否(C++) | 快照 / 列族等 | 工业级写吞吐与压缩、功能全 | 编译重、调参复杂 | 写极重、要成熟运维经验 |
| sanakirja | B tree | 是 | 事务 | 轻量、可嵌进更高层 DB | 文档与社区小于 redb | 自研存储引擎底层 |
粗分:新项目默认 redb;写密集纯 Rust → fjall;读多且要 LMDB 模型 → heed;极致写且能接受 C++ 依赖 → rocksdb。
怎么选
| 需求 | 建议 |
|---|---|
| 要 SQL / 复杂查询 | SQLite + rusqlite(同步)或 sqlx(异步) |
| 通用 KV、读多、省心 | redb |
| 高写入、纯 Rust | fjall |
| 工业级 LSM、能接受 C++ | rocksdb |
| 多进程只读友好 | heed(LMDB) |
| sled 遗留代码 | 仅维护;新功能迁 redb |
注意
- 嵌入式库多半是 单进程写;多进程同时写同一库文件容易出问题。SQLite / LMDB 在多进程读上相对成熟。
- 写入耐久性(
fsync/ WAL)会影响吞吐,看 benchmark 要对齐 durability。 - KV 新项目优先 redb,别再开新的 sled。
rusqlite与sqlx都依赖libsqlite3-sys,同一 workspace 注意版本对齐。
推荐(一句话)
要查询 → rusqlite(同步)或 sqlx(异步);默认 KV → redb;写密集纯 Rust → fjall;工业级 LSM → rocksdb;多进程读 → heed。