pub struct RTCache<K, T, CB, S>
where K: Hash + Send, T: Clone + Send,
{ /* private fields */ }
Expand description

A read-through in-memory cache on top of MemoryCache

Instead of providing a put function, RTCache requires a type which implements Lookup to be automatically called during cache miss to populate the cache. This is useful when trying to cache queries to external system such as DNS or databases.

Lookup coalescing is provided so that multiple concurrent lookups for the same key results only in one lookup callback.

Implementations§

source§

impl<K, T, CB, S> RTCache<K, T, CB, S>
where K: Hash + Send, T: Clone + Send + Sync,

source

pub fn new( size: usize, lock_age: Option<Duration>, lock_timeout: Option<Duration> ) -> Self

Create a new RTCache of given size. lock_age defines how long a lock is valid for. lock_timeout is used to stop a lookup from holding on to the key for too long.

source§

impl<K, T, CB, S> RTCache<K, T, CB, S>
where K: Hash + Send, T: Clone + Send + Sync, CB: Lookup<K, T, S>,

source

pub async fn get( &self, key: &K, ttl: Option<Duration>, extra: Option<&S> ) -> (Result<T, Box<Error>>, CacheStatus)

Query the cache for a given value. If it exists and no TTL is configured initially, it will use the ttl value given.

source§

impl<K, T, CB, S> RTCache<K, T, CB, S>
where K: Hash + Send, T: Clone + Send + Sync, CB: MultiLookup<K, T, S>,

source

pub async fn multi_get<'a, I>( &self, keys: I, ttl: Option<Duration>, extra: Option<&S> ) -> Result<Vec<(T, CacheStatus)>, Box<Error>>
where I: Iterator<Item = &'a K>, K: 'a,

Same behavior as RTCache::get but for an arbitrary amount of keys.

If there are keys that are missing from cache, multi_lookup is invoked to populate the cache before returning the final results. This is useful if your type supports batch queries.

To avoid dead lock for the same key across concurrent multi_get calls, this function does not provide lookup coalescing.

Auto Trait Implementations§

§

impl<K, T, CB, S> !RefUnwindSafe for RTCache<K, T, CB, S>

§

impl<K, T, CB, S> Send for RTCache<K, T, CB, S>
where CB: Send, S: Send,

§

impl<K, T, CB, S> Sync for RTCache<K, T, CB, S>
where CB: Sync, K: Sync, S: Sync, T: Sync,

§

impl<K, T, CB, S> Unpin for RTCache<K, T, CB, S>
where CB: Unpin, K: Unpin, S: Unpin, T: Unpin,

§

impl<K, T, CB, S> !UnwindSafe for RTCache<K, T, CB, S>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.