CandyStore:高速持久化键值存储的纯Rust实现
项目介绍
CandyStore 是一个基于纯 Rust 编写的快速、持久的进程内键值存储库。它采用了一种创新的分片算法,实现了高效的键值对管理和数据持久化。CandyStore 的设计目标是提供极低的内存占用(约0.6%的内存开销)、无限制的合并操作、无需写前日志(WAL)或日记账,同时保证进程崩溃安全。
项目技术分析
CandyStore 的核心是一个类似于哈希表的存储结构,它将键通过哈希函数映射到64位数字。其中,最高16位用于选择分片(shard),接下来16位用于选择该分片内的行(row),最后32位作为不透明的签名。这种设计使得数据访问高效且易于扩展。
每个分片映射到一个分片文件,当分片文件过大或其中一行过满时,会进行拆分操作。拆分会将所有条目分为上下两半,分别存储在两个新的分片文件中。这种分片和拆分机制能够有效地构建一个分片文件树,且每个文件都是独立拆分的。
CandyStore 采用了内存映射(mmap)来存储分片文件的头部信息,包括行、签名和文件偏移量。数据部分则使用 pread
和 pwrite
进行访问。文件仅在扩展时修改,直到发生拆分或压缩操作,从而保证了崩溃安全性。
项目依赖操作系统内核的页面缓存,假设 mmap
和写入操作会定期刷新到磁盘,从而避免了写前日志的需要。
项目技术应用场景
CandyStore 适用于需要高速、低内存开销的键值存储场景,如:
- 缓存系统
- 分布式数据库的底层存储
- 实时数据流处理
- 高性能计算
其设计允许它在写密集和读密集的工作负载下都能表现出色,同时支持多线程并发访问。
项目特点
- 高效性能:CandyStore 提供了极快的查找、插入和删除操作,均小于1微秒。
- 低内存开销:项目内存开销极低,约为0.6%,使得存储更加高效。
- 进程崩溃安全:即使进程崩溃,也不会导致数据不一致,最多丢失未刷新的数据。
- 无需写前日志:省去了写前日志的开销,提高了性能。
- 无全局锁定:分片间的拆分和压缩操作无需全局锁定,提升了并发性能。
- 适用SSD存储:针对 SSD 进行优化,未针对 HDD 优化。
以下是一个简单的使用示例:
use candystore::{Config, Result, CandyStore};
let db = CandyStore::open("/tmp/candy-dir", Config::default())?;
db.insert("mykey", "myval")?;
assert_eq!(db.get("mykey")?, Some("myval".into()));
assert_eq!(db.get("yourkey")?, None);
assert_eq!(db.iter().count(), 1);
for res in db.iter() {
let (k, v) = res?;
assert_eq!(k, "mykey".into());
assert_eq!(v, "myval".into());
}
CandyStore 的设计理念和实现使其成为需要高速、持久化键值存储的 Rust 项目的理想选择。通过其高效的算法和数据结构,CandyStore 能够为开发者提供卓越的性能和可靠性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考