#key-value-store #thread-safe #disk #pair #data-store #index #lookup

skv

一个简单的线程安全的磁盘后端键值存储

3 个版本

0.1.2 2023 年 7 月 16 日
0.1.1 2023 年 6 月 19 日
0.1.0 2023 年 6 月 18 日

629文件系统

每月 33 次下载

MIT 许可证

14KB
211

skv

Crates.io Apache 2.0 licensed

用 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