6个版本 (3个重大更新)

0.4.0 2023年9月25日
0.3.2 2023年9月7日
0.3.1 2023年6月29日
0.2.0 2023年6月2日
0.1.0 2023年6月1日

#282 in 缓存


3 个存储库中使用 (2 个直接使用)

MIT/Apache

68KB
1K SLoC

Rubin

内存数据存储,支持在磁盘上持久化,并支持客户端/服务器协议。

类似Aldi自有品牌的Redis。

非常多的待改进之处


lib.rs:

具有磁盘持久化选项的内存存储。

这个库设计为轻量级的Redis类似克隆,用于简单的键值对内存存储。

该项目是一个非常粗糙的待改进版本,未来计划添加更多功能。

作为库的使用

这个库的主要用途是在项目代码中使用。

它可以作为一个内存键值存储,在需要时存储和检索值。该存储还可以通过在磁盘上序列化数据来实现持久化。

作为内存存储的使用

这是默认的使用案例,其中使用store::mem::MemStore作为键值存储。值可以在需要时添加和检索,并且当存储被丢弃时所有数据都会丢失。

use rubin::store::mem::MemStore;

let mut ms = MemStore::new();

// Store a value for later use
ms.insert_string("key-1", "value1");

// ...

let value = ms.get_string("key-1").unwrap();

// Use the value when needed.

作为持久存储的使用

存储可以作为持久存储使用,其行为与内存存储相同,但可以选择将存储内容保存到磁盘上的JSON格式。

这在对快速数据访问和数据保留有要求时非常有用。

store::persistence::PersistentStore使用tokio::fs进行异步文件I/O以从磁盘保存/加载数据。

use rubin::store::persistence::PersistentStore;

#[tokio::main]
async fn main() -> std::io::Result<()> {
    // Create a Persistent store which automatically creates a storage location from the given
    // path.
    let mut ps = PersistentStore::new("./storage_folder").await?;

    // By default, the store does not write to disk automatically
    ps.insert_string("key-1", "value1").await?;

    // Manually writing to disk
    // All data is saved to a file called `rubinstore.json` in the storage location
    ps.write().await?;

    // A flag can be set to write automatically after each update
    ps.set_write_on_update(true);

    // After the flag is set, the values are written to disk automatically
    ps.insert_string("key-2", "value2").await?;

    // Retrieving a value from the Store
    // As this is using the in-memory store, no async operations area required.
    let value = ps.get_string("key-1");

    Ok(())
}

作为客户端/服务器的使用

该库还提供将存储作为内存网络存储使用TCP套接字通过tokio::net进行操作的选项。

可以启动一个服务器,该服务器将操作一个 store::mem::MemStore,可以通过 net::client::RubinClient 与之通信,该客户端可用于在服务器上存储和检索值。

使用服务器

该库提供启动一个服务器的能力,该服务器作为TCP套接字运行,等待连接。由于有许多实现方法,因此服务器操作的具体实现取决于最终用户。

目前,服务器仅作为内存存储器运行,没有持久化选项,但这将是未来计划的功能升级。

基本示例

use rubin::net::server::start;

#[tokio::main]
async fn main() -> std::io::Result<()> {
    // Start a server as a separate Tokio task
    tokio::task::spawn(start("127.0.0.1", 9876));

    // Endless loop but the actual implementation is up to the user.
    loop {}

    Ok(())
}

使用客户端

提供了一个客户端,可用于连接到已运行的服务器,可用于向服务器存储中插入和检索值。

仅在请求操作时建立连接,操作完成后不会持续存在。

use rubin::net::client::RubinClient;

#[tokio::main]
async fn main() -> std::io::Result<()> {
    // Create a client which stores the address for a later point
    let client = RubinClient::new("127.0.0.1", 9876);

    /// ...
    
    // Set a value in the server
    // This will connect to the server and send the request
    // After each operation, the connection is dropped
    client.insert_string("user:1000", "value").await?;

    // ...

    // Request a value from the server
    // The server will then response with the value if it is present
    let value = client.get_string("user:1000").await?;

    Ok(())
}

依赖关系

~4–11MB
~110K SLoC