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 缓存
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