jaemk / cached

Rust cache structures and easy function memoization
MIT License
1.57k stars 95 forks source link

Update cached value asynchronously, outside the thread that returns the return value of the function #147

Open kpears201 opened 1 year ago

kpears201 commented 1 year ago

If I have a function like:

#[cached(
    key = "String",
    time = 3600,
    convert = r#"{ id }"#,
    result = true,
)]
async fn get_item(id: String) -> Result<String> {
   long_network_call().await
}

If get_item is called and there is a cached value but TTL has expired. I would still like the stale cached value to be returned immediately and then long_network_call is called in another thread to update the cached value, such that the NEXT call will get the fresh value.

This is important for making sure long_network_call stays off the critical path and doesn't affect performance of anything that needs get_item. It also adds a way to use stale data if long_network_call fails. Following the idea that in many cases stale data is better than no data. I didn't see a way to do that either in this library.

Not sure I could think of a good config parameter name... Maybe stale_immediately=true or refresh_async=true

obj-obj commented 1 year ago

Yeah, this would be useful for me as well