#cache #tags #back-end #invalidation #i32 #postcard-formatter #async-redis-backend

fnct

Simple caching library that supports cache invalidation via tags

11 unstable releases

0.6.3 Mar 11, 2024
0.6.2 Dec 6, 2023
0.6.1 Sep 20, 2023
0.6.0 May 30, 2023
0.2.0 Mar 22, 2023

#283 in Caching

Download history 9/week @ 2023-12-22 23/week @ 2024-01-05 4/week @ 2024-01-12 4/week @ 2024-02-09 26/week @ 2024-02-16 49/week @ 2024-02-23 33/week @ 2024-03-01 199/week @ 2024-03-08 60/week @ 2024-03-15 26/week @ 2024-03-22 39/week @ 2024-03-29 18/week @ 2024-04-05

165 downloads per month

MIT license

27KB
383 lines

check test codecov Version dependency status

fnct

Simple caching library for Rust that supports cache invalidation via tags

Example

use std::time::Duration;

use fnct::{backend::AsyncRedisBackend, format::PostcardFormatter, keyfn, AsyncCache};
use redis::{aio::MultiplexedConnection, Client};

struct Application {
    cache: AsyncCache<AsyncRedisBackend<MultiplexedConnection>, PostcardFormatter>,
}

keyfn!(my_cache_key(a: i32, b: i32));
impl Application {
    async fn test(&self, a: i32, b: i32) -> i32 {
        self.cache
            .cached(my_cache_key(a, b), &["sum"], None, || async {
                // expensive computation
                a + b
            })
            .await
            .unwrap()
    }
}

#[tokio::main]
async fn main() {
    let Ok(redis_server) = std::env::var("REDIS_SERVER") else { return; };
    let client = Client::open(redis_server).unwrap();
    let conn = client.get_multiplexed_async_connection().await.unwrap();
    let app = Application {
        cache: AsyncCache::new(
            AsyncRedisBackend::new(conn, "my_application".to_owned()),
            PostcardFormatter,
            Duration::from_secs(600),
        ),
    };
    assert_eq!(app.test(1, 2).await, 3); // run expensive computation and fill cache
    assert_eq!(app.test(1, 2).await, 3); // load result from cache
    app.cache.pop_key(my_cache_key(1, 2)).await.unwrap(); // invalidate cache by key
    app.cache.pop_tag("sum").await.unwrap(); // invalidate cache by tag
}

Dependencies

~6–18MB
~237K SLoC