3 个版本
0.1.2 | 2023 年 7 月 16 日 |
---|---|
0.1.1 | 2023 年 6 月 19 日 |
0.1.0 | 2023 年 6 月 18 日 |
629 在 文件系统
每月 33 次下载
14KB
211 行
skv
用 Rust 编写的简单键值存储。
skv
实现了一个基本的线程安全键值存储,将数据持久化到磁盘。它维护一个索引以快速查找存储文件中的数据偏移量。可以使用 insert
方法将键值对插入存储中,并使用 get
方法检索。可以使用 load
方法从磁盘加载存储的状态,并使用 new
方法创建新的存储。
最基本的使用方法
use skv::KeyValueStore;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create a new key-value store
let kv_store = KeyValueStore::new("kv_store.db", "kv_index.db")?;
// Insert some key-value pairs
kv_store.insert("key1".to_string(), "value1".to_string())?;
kv_store.insert("key2".to_string(), "value2".to_string())?;
// Retrieve some key-value pairs
println!("{:?}", kv_store.get("key1"));
println!("{:?}", kv_store.get("key2"));
Ok(())
}
泛型输入
use skv::KeyValueStore;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create a new key-value store with a type that can be serialized
// as a byte array. In this case, we use a fixed size array.
let kv_store = KeyValueStore::<[u8;2]>::new("kv_store.db", "kv_index.db")?;
// Insert some key-value pairs
kv_store.insert("key1".to_string(), [0, 1])?;
kv_store.insert("key2".to_string(), [2, 3])?;
// Retrieve some key-value pairs
println!("{:?}", kv_store.get("key1"));
println!("{:?}", kv_store.get("key2"));
Ok(())
}
基准测试
TLDR; skv
非常快。读取大约需要 ~18µs,写入大约需要 ~750µs 🏎️
请运行 cargo bench
在您的机器上运行基准测试以更好地了解 skv
的性能。以下基准测试是在 2019 年 MBP 上运行的,可能不能代表您的机器。
基准测试 | 下限 | 估计 | 上限 |
---|---|---|---|
随机读取 | 17.544 µs | 17.774 µs | 18.035 µs |
随机写入 | 710.12 µs | 756.05 µs | 804.26 µs |
顺序读取 | 17.864 µs | 18.160 µs | 18.497 µs |
顺序写入 | 698.29 µs | 746.16 µs | 800.71 µs |
限制
以下是 skv
的一些限制。这些限制可能在未来的版本中得到解决,或者可能需要更复杂的实现。skv
旨在保持极其简单且易于使用,可能不适合您的用例。
- 基准测试是在相对较小的数据集 <1M 键值对 上进行的
- 仅支持
String
键值对 - 索引未针对内存使用进行优化,查找为 O(n)
- 持久化的数据未压缩或针对存储进行优化
依赖关系
~0.7–1.4MB
~31K SLoC