TurboKV是一个用Rust编写的快速嵌入式键值存储数据库,支持异步操作、原子批处理、有序范围扫描、可配置持久性、压缩和后台压缩功能。
正文
好的,这是根据您的要求,对原文进行的中文重述,保留了核心细节,并删减了与主题无关的装饰性内容。
项目名称: TurboKV
项目简介: 一个用 Rust 编写的快速、嵌入式键值存储库。
核心特性: TurboKV 是一个异步的嵌入式键值数据库,具备以下功能: * 原子批处理:支持原子性的批量写入操作。 * 有序范围扫描:支持按键的字典序进行范围查询和前缀扫描。 * 可配置持久性:提供多种持久性级别,以平衡性能和数据安全。 * 压缩:支持数据压缩(默认使用 LZ4,也可选 Snappy、Zstd 或不压缩)。 * 后台压缩:自动在后台进行数据压缩和整理。
安装方式:
在 Cargo.toml 中添加依赖:
toml
[dependencies]
turbokv = "0.6"
tokio = { version = "1", features = ["full"] }
注意:TurboKV 的持久化布隆过滤器格式使用了硬件 AES 指令,编译时可能需要根据目标平台设置相应的 RUSTFLAGS。
快速入门示例:
1. 打开或创建一个数据库。
2. 执行插入、获取、删除等基本操作。
3. 使用 WriteBatch 进行原子性的批量写入。
4. 使用 scan_prefix 进行前缀扫描。
5. 最后关闭数据库。
API 详解:
持久性预设:
fast():无预写日志(WAL),性能最高,但进程崩溃可能导致数据丢失,适用于缓存或可重建数据。durable()(默认):写入 WAL 但不等待磁盘同步,可抵御进程崩溃,是推荐的默认选项。paranoid():写入 WAL 并等待磁盘同步完成,提供最强的持久性保证,但性能受限于磁盘同步延迟。
数据库操作:
- 打开与配置:通过
Db::open(path)或Db::open_with_options(path, options)打开数据库。DbOptions可配置 WAL 开关、同步策略、内存表大小、块缓存大小和压缩算法。 - 单点操作:
insert、get、remove、contains_key。 - 批量操作:
insert_many(非原子性)和write_batch(原子性)。WriteBatch可以包含多个put和delete操作。 - 范围与前缀扫描:
range(start, end)和scan_prefix(prefix)会立即收集所有匹配的键值对。range_iter和scan_prefix_iter则提供流式迭代器,可以惰性地读取数据,更节省内存。流式迭代器提供count、keys、collect_pairs、paginate等方法,以及EntryGuard来访问键和值。 - 持久化与维护:
flush()用于强制刷新写入;compact()用于手动触发压缩;status()、logical_stats()、physical_stats()用于获取数据库状态和统计信息;close()用于安全关闭数据库。
- 打开与配置:通过
性能基准测试: 基准测试对比了 TurboKV(三种持久性模式)、fjall 和 redb 在不同工作负载下的吞吐量(每秒确认的键数)。测试环境为 Apple M4 芯片、macOS 系统。
测试结果摘要:
- TurboKV Fast 模式 在几乎所有场景下吞吐量最高,尤其是在单键事务中。
- TurboKV Durable 模式 性能依然出色,远高于 fjall 和 redb。
- TurboKV Paranoid 模式 在单键事务中性能极低(受限于磁盘同步延迟),但在批量事务中通过分摊同步开销,性能得到显著提升。
- fjall 和 redb 的性能相对较低,尤其是在单键事务场景下。
测试说明:
- TurboKV Fast 模式禁用了 WAL。
- TurboKV Durable 模式写入 WAL 但不进行每次确认的磁盘同步。
- TurboKV Paranoid 模式在返回前进行磁盘同步,其单键吞吐量受限于存储同步延迟。
- 测试使用了 20 字节的键和 400 字节的值,总数据量超过内存表大小,以触发后台刷新。测试禁用了压缩和块缓存,并保留了操作系统页面缓存。
评论
根据评论内容,主要观点和论据如下:
性能与实现技术:评论1指出高速可能源于硬件AES和LZ4压缩,并推测扫描时使用SIMD。关键引用:"TurboKV's persisted Bloom-filter format uses hardware AES"、"built-in LZ4 compression"。
持久性定义争议:评论2质疑"durable"模式的实际持久性,认为仅能应对进程重启而非断电。关键引用:"Durable doesn't mean 'survives a process restart'"、"wouldn't survive power loss"。
嵌入式适用性:评论3指出"embedded"通常指nostd,而该项目并非如此。关键引用:"Embedded could also mean nostd, which this is absolutely not"。
开发者调侃:评论5和6以幽默方式指出程序员常自建数据库。关键引用:"Oops you built a database!"、"Every programmer eventually creates own db"。
术语与功能:评论7调侃"blazing fast"已成梗,评论8询问原子性get+delete操作,评论9赞赏先做logo的优先级。
性能对比缺失:评论10质疑"fast"缺乏比较基准。关键引用:"Fast compared to what?"
总体而言,评论聚焦技术实现、持久性定义、适用性及功能需求,同时包含对术语和开发文化的调侃,但缺乏对性能基准的明确对比。