pub struct MemoryStateBackend { /* private fields */ }Expand description
In-memory state backend using DashMap
This backend stores all state in memory using a concurrent hash map (DashMap). It’s ideal for:
- Testing: Fast, no external dependencies
- Stateless processing: When state doesn’t need to survive restarts
- Small state: When state fits comfortably in memory
- High throughput: Fastest possible state access
§Features
- Thread-safe: Uses DashMap for lock-free concurrent access
- TTL support: Automatic expiration of old entries
- Statistics: Tracks access patterns and cache hit rates
- Checkpoint/Restore: Can snapshot state to disk
§Example
use processor::state::{MemoryStateBackend, StateBackend};
use std::time::Duration;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// Create backend with 1-hour TTL
let backend = MemoryStateBackend::new(Some(Duration::from_secs(3600)));
// Store state
backend.put(b"session:123", b"user_data").await?;
// Retrieve state
if let Some(data) = backend.get(b"session:123").await? {
println!("Session data: {:?}", data);
}
// Get statistics
let stats = backend.stats().await;
println!("Hit rate: {:.2}%",
100.0 * stats.hit_count as f64 / (stats.hit_count + stats.miss_count) as f64);
Ok(())
}Implementations§
Source§impl MemoryStateBackend
impl MemoryStateBackend
Sourcepub fn new(ttl: Option<Duration>) -> Self
pub fn new(ttl: Option<Duration>) -> Self
Create a new in-memory state backend
§Arguments
ttl- Optional time-to-live for entries. If None, entries never expire.
§Returns
A new MemoryStateBackend instance
§Example
use processor::state::MemoryStateBackend;
use std::time::Duration;
// No TTL - entries never expire
let backend1 = MemoryStateBackend::new(None);
// 1 hour TTL
let backend2 = MemoryStateBackend::new(Some(Duration::from_secs(3600)));Sourcepub async fn stats(&self) -> MemoryBackendStats
pub async fn stats(&self) -> MemoryBackendStats
Sourcepub async fn cleanup_expired(&self) -> usize
pub async fn cleanup_expired(&self) -> usize
Clean up expired entries
This method scans all entries and removes those that have exceeded the TTL. Returns the number of entries removed.
§Returns
Number of entries removed
§Example
let backend = MemoryStateBackend::new(Some(Duration::from_secs(60)));
// Periodically clean up expired entries
let removed = backend.cleanup_expired().await;
println!("Removed {} expired entries", removed);Sourcepub fn start_cleanup_task(&self, interval: Duration) -> JoinHandle<()> ⓘ
pub fn start_cleanup_task(&self, interval: Duration) -> JoinHandle<()> ⓘ
Start automatic cleanup background task
Spawns a background task that periodically cleans up expired entries.
§Arguments
interval- How often to run cleanup
§Returns
A handle that cancels the cleanup task when dropped
§Example
let backend = MemoryStateBackend::new(Some(Duration::from_secs(3600)));
// Clean up every 5 minutes
let _cleanup_handle = backend.start_cleanup_task(Duration::from_secs(300));
// Cleanup runs in background...Sourcepub async fn checkpoint(&self) -> Vec<(Vec<u8>, Vec<u8>)>
pub async fn checkpoint(&self) -> Vec<(Vec<u8>, Vec<u8>)>
Create a checkpoint of current state
Returns all key-value pairs as a vector for serialization.
§Returns
Vector of (key, value) pairs
Sourcepub async fn restore(
&self,
checkpoint: Vec<(Vec<u8>, Vec<u8>)>,
) -> StateResult<()>
pub async fn restore( &self, checkpoint: Vec<(Vec<u8>, Vec<u8>)>, ) -> StateResult<()>
Restore state from a checkpoint
Replaces all current state with the provided checkpoint data.
§Arguments
checkpoint- Vector of (key, value) pairs to restore
Sourcepub async fn memory_usage(&self) -> usize
pub async fn memory_usage(&self) -> usize
Trait Implementations§
Source§impl Clone for MemoryStateBackend
impl Clone for MemoryStateBackend
Source§impl StateBackend for MemoryStateBackend
impl StateBackend for MemoryStateBackend
Source§fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<Option<Vec<u8>>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<Option<Vec<u8>>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Retrieve a value for the given key Read more
Source§fn put<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
value: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn put<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
value: &'life2 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Store a value for the given key Read more
Source§fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Delete a key and its associated value Read more
Source§fn list_keys<'life0, 'life1, 'async_trait>(
&'life0 self,
prefix: &'life1 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<Vec<Vec<u8>>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn list_keys<'life0, 'life1, 'async_trait>(
&'life0 self,
prefix: &'life1 [u8],
) -> Pin<Box<dyn Future<Output = StateResult<Vec<Vec<u8>>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
List all keys with the given prefix Read more
Source§fn clear<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = StateResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn clear<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = StateResult<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Clear all state from the backend Read more
Auto Trait Implementations§
impl !RefUnwindSafe for MemoryStateBackend
impl !UnwindSafe for MemoryStateBackend
impl Freeze for MemoryStateBackend
impl Send for MemoryStateBackend
impl Sync for MemoryStateBackend
impl Unpin for MemoryStateBackend
impl UnsafeUnpin for MemoryStateBackend
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
Source§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
Wrap the input message
T in a tonic::RequestSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self to the equivalent element of its superset.