#过期 #延迟 #缓存 #异步 #类型

simple-async-cache-rs

一个具有过期延迟和自定义类型的快速异步缓存crate

9次发布

0.3.3 2021年10月11日
0.3.2 2021年10月11日
0.2.0 2021年7月8日
0.1.3 2021年7月8日
0.1.2 2021年6月30日

#209缓存

Download history 4/week @ 2024-03-30

58 每月下载

MIT 许可证

6KB
93

simple-async-cache-rs

一个具有过期延迟和自定义类型的快速异步缓存crate。

你为什么要使用这个crate呢?

  • 你可以配置过期延迟
  • 它支持几乎所有类型/结构体
  • 它非常简单,并且完全用Rust编写
  • 它可以防止缓存穿透效应
  • 它的唯一依赖是tokio。
  • 它是线程安全的,并且速度很快

基本示例

use simple_async_cache_rs::AsyncCacheStore;
use std::time::Duration;
use tokio::time::sleep;


#[tokio::main]
async fn main() {
    // Create an AsyncCacheStore using implicit typing with an expiration delay of 10 seconds.
    let mut store = AsyncCacheStore::new(10);

    // If you want to explicitly define types you can do the following:
    // let mut store: Arc<AsyncCacheStore<String, String>> = AsyncCacheStore::new(60);

    let cache = store.get("key_1".to_string()).await;
    let mut result = cache.lock().await;
    match &mut *result {
        Some(_d) => {
            // You can  get here the cached value for key_1 if it is already available.
        }
        None => {
            // There is no existing entry for key_1, you can do any task to get the value.
            // The AsyncCacheStore prevents dogpile effect by itself.
            *result = Some("This is the first value for key_1.");
        }
    }

    // The value for key_1 is still cached.
    assert_eq!(
        *store.get("key_1".to_string()).await.lock().await,
        Some("This is the first value for key_1.")
    );

    // We sleep for 15 seconds, the value for key_1 is expired.
    sleep(Duration::from_secs(15)).await;

    assert_eq!(
        *store.get("key_1".to_string()).await.lock().await,
        None
    );
}

依赖项

~2–3MB
~46K SLoC