pub struct Cache { /* private fields */ }Implementations§
Source§impl Cache
impl Cache
Sourcepub fn open(path: &Path, max_size_mb: usize) -> Result<Self>
pub fn open(path: &Path, max_size_mb: usize) -> Result<Self>
Opens the cache, without fsyncing on every commit.
A durable commit costs ~2.0 ms for a 49-row entry against ~55 µs without one — 97% of a cache write, and far more than the query whose result is being stored. Paying it makes populating the cache several times more expensive than not having a cache at all.
MDB_NOSYNC drops the D of ACID and keeps the rest: LMDB still
writes whole pages and flips the meta page atomically, so the database
stays structurally valid — a system crash can cost the most recent
commits, not the store. That is the right trade for this data, because
every entry is a copy of something Postgres can produce again, so
losing one costs a cache miss. Drop flushes, so an ordinary shutdown
keeps everything anyway; only a power loss or a kill -9 forfeits the
last writes.
Deliberately not combined with MDB_WRITEMAP. The two together do
risk real corruption on a system crash, and the writable mmap buys
nothing once the fsync is gone.
pub fn get(&self, key: &str) -> Result<Option<CachedEntry>>
pub fn put( &self, key: &str, rows: Vec<DecodedValue>, tags: Vec<String>, ) -> Result<()>
Sourcepub fn flush(&self) -> Result<()>
pub fn flush(&self) -> Result<()>
Forces everything committed so far to disk. Called on Drop, so an
ordinary shutdown loses nothing; call it directly to checkpoint
sooner.
Sourcepub fn invalidate(&self, tags: &[String]) -> Result<()>
pub fn invalidate(&self, tags: &[String]) -> Result<()>
Evicts every cache entry tagged with any of tags — called from the
LISTEN/NOTIFY invalidation path after a write commits.
Sourcepub fn stat(&self) -> Result<CacheStats>
pub fn stat(&self) -> Result<CacheStats>
Current size of the cache — see CacheStats.
Trait Implementations§
Source§impl Drop for Cache
impl Drop for Cache
Source§fn drop(&mut self)
fn drop(&mut self)
Flush on the way out, so the deferred sync open selects costs
nothing on an ordinary shutdown — only an abrupt one (power loss,
SIGKILL) forfeits the most recent writes.
Errors are swallowed deliberately: this runs during teardown, where there is nobody left to report to, and a cache that failed to persist is a cache miss rather than a fault.
Auto Trait Implementations§
impl Freeze for Cache
impl RefUnwindSafe for Cache
impl Send for Cache
impl Sync for Cache
impl Unpin for Cache
impl UnsafeUnpin for Cache
impl UnwindSafe for Cache
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
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
Source§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.