pub struct FoyerHybridCache { /* private fields */ }Expand description
Hybrid memory + disk cache backed by foyer.
Construction requires an async runtime because foyer’s builder is async. We pin a dedicated multi-thread runtime to the cache instance and reuse it for the slow path on memory miss.
Implementations§
Source§impl FoyerHybridCache
impl FoyerHybridCache
Sourcepub fn open(config: FoyerCacheConfig) -> Result<Arc<Self>, FoyerCacheError>
pub fn open(config: FoyerCacheConfig) -> Result<Arc<Self>, FoyerCacheError>
Build a new hybrid cache. Creates the on-disk directory if missing. Allocates a fresh tokio runtime for foyer’s async paths.
Sourcepub fn open_with_runtime(
config: FoyerCacheConfig,
runtime: Arc<Runtime>,
) -> Result<Arc<Self>, FoyerCacheError>
pub fn open_with_runtime( config: FoyerCacheConfig, runtime: Arc<Runtime>, ) -> Result<Arc<Self>, FoyerCacheError>
Build the cache with a caller-provided runtime. Useful for sharing a runtime across multiple subsystems in the same process.
pub fn ssd_dir(&self) -> &Path
pub fn hits(&self) -> u64
pub fn misses(&self) -> u64
pub fn inserts(&self) -> u64
Sourcepub fn get(&self, key: &str) -> Option<Bytes>
pub fn get(&self, key: &str) -> Option<Bytes>
Sync read. Probes the in-memory tier first to avoid a runtime hop
on warm hits. Falls through to foyer’s async hybrid get only when
the memory tier misses.
Convenience wrapper over get_with_tier for callers that don’t
need to distinguish RAM vs SSD hits.
Sourcepub fn get_with_tier(&self, key: &str) -> Option<(Bytes, FoyerHitTier)>
pub fn get_with_tier(&self, key: &str) -> Option<(Bytes, FoyerHitTier)>
Sync read with tier attribution. Returns the tier the value was served from on hit. Lets callers attribute load latency to the right tier, critical for diagnosing the “blob too big for RAM tier, always SSD-streamed” case (e.g. qwen3’s pre-allocated 4.7 GiB KV cache against a 2 GiB RAM budget).
Sourcepub fn contains(&self, key: &str) -> bool
pub fn contains(&self, key: &str) -> bool
Sync existence check that does not materialize the cached payload.
Sourcepub fn put(&self, key: &str, payload: Bytes)
pub fn put(&self, key: &str, payload: Bytes)
Sync write. Foyer’s insert is sync; the disk-side flush happens on
background workers driven by the cache’s spawner.
Sourcepub fn close(&self)
pub fn close(&self)
Block until the foyer write-queue has drained to SSD.
Foyer’s Drop impl spawns a close future on the cache’s own
spawner but does NOT wait for it, so process exit immediately
after the last Arc clone drops can leave SSD entries un-flushed.
This method is the explicit drain hook callers should invoke
before tearing down the cache; the Drop impl on
FoyerHybridCache also calls it on a best-effort basis.
Trait Implementations§
Source§impl Drop for FoyerHybridCache
impl Drop for FoyerHybridCache
Auto Trait Implementations§
impl !Freeze for FoyerHybridCache
impl !RefUnwindSafe for FoyerHybridCache
impl Send for FoyerHybridCache
impl Sync for FoyerHybridCache
impl Unpin for FoyerHybridCache
impl UnsafeUnpin for FoyerHybridCache
impl !UnwindSafe for FoyerHybridCache
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> 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>
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>
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> 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.Source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);