@nuskey8: 我们发布了 lkv,一个用 Rust 实现的新嵌入式数据库。它是一个专为点查找设计的轻量级 KVS,实现了高读取性能…

X AI KOLs Timeline 工具

摘要

nuskey8 发布了 lkv,这是一个用 Rust 编写的轻量级嵌入式键值存储,针对点查找进行了优化,声称比 SQLite 快约 165 倍,比 LMDB 快约 15 倍,且功能集极简。

我们发布了 lkv,一个用 Rust 实现的新嵌入式数据库。它是一个专为点查找设计的轻量级 KVS,通过大幅限制功能来实现高读取性能。与 SQLite 的默认设置相比,速度约为其 165 倍;与 LMDB 相比,速度约为其 15 倍。■仓库 https://github.com/nuskey8/lkv
查看原文
查看缓存全文

缓存时间: 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::HashMap11.48N/AN/A2.74N/AN/AN/A
lkv79.944.706.433.294.9429.179.44
redb169.364.987.1438.245.12128.5016.70
LMDB (heed)56.795.406.1950.125.0836.139.10
RocksDB65.235.406.8977.895.2210.0710.07
Fjall168.254.235.7171.054.9773.80N/A
sled686.084.4513.0555.135.7980.18N/A
SQLite (rusqlite)98.800.341.35545.170.4321.3910.51
jammdb132.795.239.8572.075.4564.50N/A

许可证

MIT

相似文章