pub struct TtlCache<K, V> { /* private fields */ }std only.Expand description
A bounded, thread-safe cache with per-entry time-to-live.
Each entry is stamped with a deadline at insert time. On every access
(get, contains_key,
len), expired entries are removed lazily. On overflow,
the entry with the soonest expiration is evicted — already-expired
entries are naturally preferred over live ones.
Both insert and insert_with_ttl
reset the deadline on the affected entry — writes always re-arm the timer.
§Implementation
Sharded into up to 16 independent stores keyed by hash of K. Each
shard owns its own HashMap and applies expiry / overflow eviction
locally. Tiny caches (< 32 entries) use a single shard.
Eviction is per-shard approximate — overflow inside one shard evicts the soonest-expiring entry within that shard, not necessarily the soonest-expiring entry globally. Lazy expiry remains exact within the operating shard.
§Example
use std::time::Duration;
use cache_mod::{Cache, TtlCache};
let cache: TtlCache<&'static str, u32> =
TtlCache::new(4, Duration::from_secs(60)).expect("capacity > 0");
cache.insert("session", 42);
assert_eq!(cache.get(&"session"), Some(42));Implementations§
Source§impl<K, V> TtlCache<K, V>
impl<K, V> TtlCache<K, V>
Sourcepub fn new(capacity: usize, ttl: Duration) -> Result<Self, CacheError>
pub fn new(capacity: usize, ttl: Duration) -> Result<Self, CacheError>
Creates a cache with the given capacity and default time-to-live.
ttl is applied to every insert that does not specify its own.
Returns CacheError::InvalidCapacity if capacity == 0.
§Example
use std::time::Duration;
use cache_mod::TtlCache;
let cache: TtlCache<String, u32> =
TtlCache::new(128, Duration::from_secs(300)).expect("capacity > 0");Sourcepub fn with_capacity(capacity: NonZeroUsize, ttl: Duration) -> Self
pub fn with_capacity(capacity: NonZeroUsize, ttl: Duration) -> Self
Creates a cache with the given non-zero capacity and default TTL. Infallible.
§Example
use std::num::NonZeroUsize;
use std::time::Duration;
use cache_mod::TtlCache;
let cap = NonZeroUsize::new(64).expect("64 != 0");
let cache: TtlCache<String, u32> =
TtlCache::with_capacity(cap, Duration::from_secs(60));Sourcepub fn insert_with_ttl(&self, key: K, value: V, ttl: Duration) -> Option<V>
pub fn insert_with_ttl(&self, key: K, value: V, ttl: Duration) -> Option<V>
Inserts value under key with a per-call TTL that overrides the
cache default. The deadline is now + ttl.
Returns the previously-stored live value if key was already
present and not yet expired. An expired-but-not-yet-cleaned entry
is treated as absent: the call returns None and replaces it.
§Example
use std::time::Duration;
use cache_mod::{Cache, TtlCache};
let cache: TtlCache<u32, u32> =
TtlCache::new(4, Duration::from_secs(60)).expect("capacity > 0");
cache.insert_with_ttl(1, 10, Duration::from_secs(5));
assert_eq!(cache.get(&1), Some(10));Trait Implementations§
Source§impl<K, V> Cache<K, V> for TtlCache<K, V>
impl<K, V> Cache<K, V> for TtlCache<K, V>
Source§fn get(&self, key: &K) -> Option<V>
fn get(&self, key: &K) -> Option<V>
key, if any, and counts as an
access for the purposes of the eviction policy.Source§fn remove(&self, key: &K) -> Option<V>
fn remove(&self, key: &K) -> Option<V>
key and returns the value if present.