#key-value-store #in-memory #持久化 #持久性 #选项 #aof

hurrahdb

Hurrahdb 是一个基于 Rust 的持久化(AOF)内存中的键值存储

1 个不稳定版本

0.1.0 2023年3月12日

#2 in #持久性

MIT/Apache

18KB
408

hurrahdb

Hurrahdb 是一个内存中的键值存储,具有持久化选项。目前仅支持 AOF 选项进行持久化。

使用 AOF 持久化数据是异步的,并且根据 sync_time 将数据刷新到数据库中。其中 sync_time 的单位是毫秒。

使用方法

在缓存/存储数据时,键需要是 string 类型,值需要是来自 serde 库的派生自 SerializeDeserialize 的结构体或枚举。以下是一个示例模型:

use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
struct DummyStruct {
    value: String,
}

仅内存

当创建存储时没有配置,则不会初始化任何持久化逻辑。

// define a storage object with None
let storage = match Storage::new(None) {
    Ok(storage) => storage,
    Err(err) => {
        // Handle the error
    }
};

// Cache the `DummyStruct` struct with key "some-key"
match storage.set(
    "some-key".to_string(),
    &DummyStruct {
        value: "some-value".to_string(),
    },
) {
    Ok(()) => {}
    Err(err) => {
        // Handle the error
    }
}

// Fetch the `DummyStruct` data using key "some-key"
let result_option: Option<DummyStruct> = match storage.get("some-key".to_string()) {
    Ok(result) => result,
    Err(err) => {
        // Handle the error
    }
};

内存加 AOF

当创建带有 AOF 配置的存储时,它将读取输入文件并预先使用文件中的数据创建哈希表。除此之外,还会创建一个后台作业,根据 sync_time 值将数据刷新到磁盘。

注意:

  • 由于数据刷新是异步的,因此不能保证持久化。在应用程序的关闭/崩溃状态下,您可能会丢失数据。
  • 需要 tokio 运行时

示例用法 这里


// Define a storage with AOF config. Flushes data into file every 100ms.
let storage = match Storage::new(Some(Config {
    aof_config: Some(AofConfig {
        sync_time: 100,
        file_name: "memory-cache-test-1".to_string(),
    }),
    persistance_type: persistance::Type::AOF,
})) {
    Ok(storage) => storage,
    Err(err) => {
        // Handle the error
    }
};

// Cache the `DummyStruct` struct with key "some-key"
match storage.set(
    "some-key".to_string(),
    &DummyStruct {
        value: "some-value".to_string(),
    },
) {
    Ok(()) => {}
    Err(err) => {
        // Handle the error
    }
}

// Fetch the `DummyStruct` data using key "some-key"
let result_option: Option<DummyStruct> = match storage.get("some-key".to_string()) {
    Ok(result) => result,
    Err(err) => {
        // Handle the error
    }
};

依赖关系

~3–10MB
~93K SLoC