pub struct PostgresStore { /* private fields */ }Expand description
Postgres-based cache store for durable caching.
This store is used as the Durable tier in the tiered cache system. It provides persistent caching that survives restarts.
§Runtime Invariants
- No DDL: This store never creates, alters, or drops tables
- Assumes table exists: All queries assume the table is present
- Errors propagate: SQL errors bubble up without retry
§Schema
The store expects a table with the following schema:
CREATE TABLE {schema}.{table} (
key TEXT PRIMARY KEY,
value BYTEA,
is_none BOOLEAN NOT NULL,
expires_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CHECK (
(is_none = TRUE AND value IS NULL)
OR (is_none = FALSE AND value IS NOT NULL)
)
);
CREATE INDEX idx_{table}_expires
ON {schema}.{table} (expires_at)
WHERE expires_at IS NOT NULL;Use PostgresBuilder to create instances, or create the schema
manually in your migrations.
Implementations§
Source§impl PostgresStore
impl PostgresStore
Sourcepub async fn cleanup_expired(&self) -> Result<usize>
pub async fn cleanup_expired(&self) -> Result<usize>
Clean up expired entries.
This is an optional maintenance operation that removes expired entries from the database. It’s not required for correctness (expired entries are filtered out on read), but can help with storage efficiency.
Returns the number of entries removed.
Trait Implementations§
Source§impl CacheStore for PostgresStore
impl CacheStore for PostgresStore
Source§fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 CacheKey,
) -> Pin<Box<dyn Future<Output = Result<Option<CacheEntry>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn get<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 CacheKey,
) -> Pin<Box<dyn Future<Output = Result<Option<CacheEntry>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Get an entry from the store
Source§fn set<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 CacheKey,
entry: CacheEntry,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn set<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 CacheKey,
entry: CacheEntry,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Set an entry in the store. Read more
Source§fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 CacheKey,
) -> Pin<Box<dyn Future<Output = Result<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 CacheKey,
) -> Pin<Box<dyn Future<Output = Result<bool>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Delete a specific key
Source§fn invalidate<'life0, 'life1, 'async_trait>(
&'life0 self,
pattern: &'life1 CacheKeyPattern,
) -> Pin<Box<dyn Future<Output = Result<usize>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn invalidate<'life0, 'life1, 'async_trait>(
&'life0 self,
pattern: &'life1 CacheKeyPattern,
) -> Pin<Box<dyn Future<Output = Result<usize>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Delete keys matching a pattern
Auto Trait Implementations§
impl Freeze for PostgresStore
impl !RefUnwindSafe for PostgresStore
impl Send for PostgresStore
impl Sync for PostgresStore
impl Unpin for PostgresStore
impl !UnwindSafe for PostgresStore
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> 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 more