@nuskey8: 我们发布了 lkv,一个用 Rust 实现的新嵌入式数据库。它是一个专为点查找设计的轻量级 KVS,实现了高读取性能…
摘要
nuskey8 发布了 lkv,这是一个用 Rust 编写的轻量级嵌入式键值存储,针对点查找进行了优化,声称比 SQLite 快约 165 倍,比 LMDB 快约 15 倍,且功能集极简。
查看缓存全文
缓存时间: 2026/08/11 05:42
我们发布了 lkv,一个用 Rust 实现的新嵌入式数据库。它是一个专注于点查找(Point Lookup)的轻量级键值存储,通过大幅限制功能来实现高读取性能。与 SQLite 的默认设置相比,它的速度约为其 165 倍;与 LMDB 相比,约为其 15 倍。■仓库 https://github.com/nuskey8/lkv
nuskey8/lkv
来源:https://github.com/nuskey8/lkv
lkv
CI Crates.io (https://crates.io/crates/lkv) 文档 (https://docs.rs/lkv) GitHub 许可证
一个轻量且快速的 Rust 嵌入式键值存储。
bench
概述
lkv 是一个用 Rust 实现的轻量级快速嵌入式数据库。它专门针对基于哈希表与内存效率的读取性能而设计,提供了比 LMDB、sled、redb 等更快的查找速度。
为了保持结构简单和读取性能,lkv 的功能非常有限。以下是 lkv 支持的功能:
- 以任意字节序列
[u8]作为键/值进行读写 - 快速的无序扫描
- 快速且零拷贝的查找
- 事务
- 快照
- 显式压缩
另一方面,不支持以下功能:
- 多进程读写
- 多写者(multiple writers)
- 高级查询,如范围查询或前缀查询
- 自动压缩
由于其性能特性,它适合轻量级配置持久化或管理很少变化的主数据。相反,不建议将其用作频繁更新的通用数据库。
lkv 的设计很大程度上受到了 LinkedIn 的 PalDB (https://github.com/linkedin/paldb) 和 Bitcask (http://github.com/basho/bitcask) 的启发。此外,部分思路基于 FASTER (https://github.com/microsoft/faster)。
详细信息请参阅 docs/design.md。
安装
sh cargo add lkv
快速开始
``rust use lkv::{Database, Result};
fn main() -> Result<()> { let mut db = Database::create(“./example.lkv”)?;
let mut write = db.begin_write()?;
write.put("name", "lkv")?;
write.commit()?;
let read = db.begin_read()?;
assert_eq!(read.get("name")?, Some(b"lkv".as_slice()));
for item in read.iter()? {
let (key, value) = item?;
println!("{} = {}",
String::from_utf8_lossy(key),
String::from_utf8_lossy(value));
}
drop(read);
Ok(())
} ``
快照
在使用 lkv 的 WriteTransaction 写入数据库时,无法同时执行读取。如果要在写入期间读取数据库,可以使用 snapshot() 创建快照,并通过它进行读取。
rust let snapshot = db.snapshot()?; let old_value = snapshot.get("key")?; for item in snapshot.iter()? { let (key, value) = item?; }
压缩
lkv 的更新会追加到位于 Base 后方的 Overlay 中。随着更新和删除的增加,旧记录会保留在文件中,同时 Overlay 索引也会消耗内存。
compact() 会使用有效的键/值重建 Base,删除 Overlay 和更早的世代,并在物理上缩小数据库文件。
rust // Ensure no snapshots are referenced during compaction drop(snapshot); db.compact()?;
压缩不会自动执行。如果 Overlay 超过配置的内存限制,新的 WriteTransaction 将返回 Error::MaintenanceRequired。
在压缩过程中,会在同一文件的末尾构建一个备份 Base,因此在完成之前需要额外的磁盘空间。如果发生崩溃,重新打开时可以从已同步的 Base 进行恢复,但文件缩减可能不完整。在这种情况下,可以再次运行 compact()。
内存模式
也可以将 lkv 用作内存数据库。
rust let mut db = Database::memory();
其 API 与常规数据库完全相同,但它在内存中运行,不会创建文件。
基准测试
基准测试是在搭载 Apple M2 芯片和 24 GB 内存的 MacBook Pro 上进行的。
| DB | 批量 100k(毫秒) | 写入 1(毫秒) | 写入 1k(毫秒) | 读取 100k(毫秒) | 删除 1(毫秒) | 大小(MiB) | 压缩后大小(MiB) |
|---|---|---|---|---|---|---|---|
std::HashMap | 11.48 | N/A | N/A | 2.74 | N/A | N/A | N/A |
| lkv | 79.94 | 4.70 | 6.43 | 3.29 | 4.94 | 29.17 | 9.44 |
| redb | 169.36 | 4.98 | 7.14 | 38.24 | 5.12 | 128.50 | 16.70 |
| LMDB (heed) | 56.79 | 5.40 | 6.19 | 50.12 | 5.08 | 36.13 | 9.10 |
| RocksDB | 65.23 | 5.40 | 6.89 | 77.89 | 5.22 | 10.07 | 10.07 |
| Fjall | 168.25 | 4.23 | 5.71 | 71.05 | 4.97 | 73.80 | N/A |
| sled | 686.08 | 4.45 | 13.05 | 55.13 | 5.79 | 80.18 | N/A |
| SQLite (rusqlite) | 98.80 | 0.34 | 1.35 | 545.17 | 0.43 | 21.39 | 10.51 |
| jammdb | 132.79 | 5.23 | 9.85 | 72.07 | 5.45 | 64.50 | N/A |
许可证
相似文章
Noxu DB:Berkeley DB Java Edition的Rust移植版
Noxu DB是一个用Rust编写的嵌入式事务性键值数据库引擎,移植自Berkeley DB Java Edition,提供ACID事务、B+树存储、崩溃恢复和可选复制功能。
proveKV – 诚实的36倍无损(vs f32,18倍 vs fp16)KV缓存压缩用于LLM(零PPL回归)
一个开源仓库proveKV展示了一种可复现的KV缓存压缩技术,在SmolLM2-1.7B上实现了36倍无损(vs f32)和68倍有损内存减少,且PPL回归为零,包括Rust示例和审计管道。
DKV: 用于本地LLM推理的开源KV-cache压缩框架(CLI + 技术报告)
DKV是一个开源框架,用于在本地LLM推理过程中压缩KV-cache,提供CLI和技术报告。
@davideciffa:非常自豪地宣布,我们刚刚发布了 Luce KVFlash。在 Lucebox 中以 256k 上下文运行您偏好的模型,无需…
宣布发布 Luce KVFlash,这是一个在 Lucebox 中以 256k 上下文运行模型的工具,无需担心 KVCache 和 OOM,通过推测预填充和动态卸载,在长上下文场景下解码速度提升高达 2.9 倍。
@m_sirovatka: KV Cache 重用是代理工作负载推广中最重要的部分。我们已经将 Mooncake Store 集成到 prime-rl 中,与 vL…
vLLM 集成了 Mooncake Store 用于分布式 KV 缓存重用,支持跨节点前缀缓存,高效服务具有高令牌重用的代理工作负载。