インメモリキャッシュを扱うシンプルなRustのcrateを作った
-
Rust で key-value 形式の有効期限付きインメモリキャッシュを手軽に扱えるクレートを作ったお話。
できたもの
pocketcache: A simple in-memory cache for Rust.
HashMap
単体で key-value データを管理することに比べて、pocketcache
を使うと有効期限を持った key-value を手軽に管理することができます。
use pocketcache::cache::Cache;
use pocketcache::time::Expiration;
fn main() {
let expiration = Expiration::Hour(3);
let mut cache = Cache::<Vec<&str>>::new(expiration);
// set
cache.set("fruit", vec!["peach"]);
// get
let fruit = cache.get("fruit");
// Some(["peach"])
println!("{:?}", fruit);
// delete
cache.delete("fruit");
let fruit = cache.get("fruit");
// None
println!("{:?}", fruit);
}
できること
有効期限
Expiration
によりキャッシュ有効期限の設定ができます。
Expiration::Secound(u64)
Expiration::Minute(u64)
Expiration::Hour(u64)
Expiration::Default
get(key: &str): 取得
key に対応する値の Option<T> を取得します。期限切れの場合は None になります。
set(key: &str, value: T): 追加
key に値<T>を追加します。すでにキャッシュ値が存在する場合は上書きします。
delete(key: &str): 削除
key に対応する値を削除します。
clear(): 全削除
キャッシュされている値をすべて削除します。
マルチスレッドで使う
マルチスレッドで使う場合は Cache<T>
を Mutex<T>
でラップしたものに Arc<T>
を使って(Arc<Mutex<Cache<T>>>
)、複数のスレッド間で参照の書き換えができるようにする必要があります。
use pocketcache::cache::Cache;
use pocketcache::time::Expiration;
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let cache = Arc::new(Mutex::new(Cache::<Vec<&str>>::new(Expiration::Minute(1))));
let handle = thread::spawn(move || {
cache.lock().unwrap().set("fruit", vec!["apple", "banana"]);
});
handle.join().unwrap();
}