#cache #concurrency #tokio #utility #enough #contention #expiration

crude_cache

一个简单实用工具,用于满足足够的并发缓存需求

2 个版本

0.1.1 2023 年 8 月 15 日
0.1.0 2023 年 8 月 14 日

#214缓存

MIT 许可协议

13KB
222

CrudeCache

Crates.io Docs.rs License

CrudeCache 是一个简单实用工具,用于满足足够的并发缓存需求。灵感来源于 Play Framework 的 cache.getOrElseUpdate。

//Returns non-expired cached item. If one does not exist, new item will be cached & returned
cache.get_or_else_update("cache_key", Duration::from_secs(60), async_function).await

免责声明:请注意,CrudeCache 是为个人项目开发的,它未经生产环境测试,可能存在错误。欢迎反馈、建议和贡献。

特性

  • 缓存项的过期评估是懒加载的。
  • 为了最小化竞争点,项目存储在 ShardedMap 中,该映射将数据分割到多个分片中(HashMaps)。没有花哨的功能,也不进行重新分片。
  • 每个分片后面是 tokio::sync::RwLock

安装

将其添加到您的 Cargo.toml

[dependencies]
crude_cache = "0.1.1"

示例用法

use crude_cache::CrudeCache;

#[derive(Clone)]
pub struct DataService {
    cache: Arc<CrudeCache>,
    db: Arc<Db>
}

impl DataService {
    pub async fn get_big_data(&self) -> SomeBigType {
        self.cache.get_or_else_update("big_data", Duration::from_secs(60), || self.db.big_data()).await
    }

    pub async fn get_other_data(&self) -> OtherType {
        self.cache.get_or_else_update("other_data", Duration::from_secs(60), || self.db.other_data()).await
    }
}

类似 Crates

更复杂的替代方案

依赖项

~2.3–4MB
~65K SLoC