crude_cache

Crates.iocrude_cache
lib.rscrude_cache
version0.1.1
sourcesrc
created_at2023-08-14 06:20:00.661347
updated_at2023-08-15 13:44:19.618917
descriptionA simple utility for good enough concurrent caching needs.
homepage
repositoryhttps://github.com/defic/crude_cache
max_upload_size
id943879
size15,413
Jeremias (defic)

documentation

README

CrudeCache

Crates.io Docs.rs License

CrudeCache is a simple utility for good enough concurrent caching needs. Inspired by Play Framework's 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

Disclaimer: Please note that CrudeCache was developed for personal projects, it is not battle-tested in production and might contain bugs. Feedback, suggestions, and contributions are more than welcome.

Features

  • Expiration of cached items are evaluated lazily.
  • To minimize contention points, items are stored in a ShardedMap, which splits the data across multiple shards (HashMaps). No bells and whistles, and no resharding.
  • Each shard is behind tokio::sync::RwLock

Installation

Add this to your Cargo.toml:

[dependencies]
crude_cache = "0.1.1"

Example usage

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
    }
}

Similar Crates

More sophisticated alternative:

Commit count: 7

cargo fmt