blog.mahoroi.com

インメモリキャッシュを扱うシンプルな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();
}