use async_trait::async_trait;
use bytes::Bytes;
use foyer_memory::{Cache, CacheBuilder, LfuConfig};
use super::backend::{FillHint, RangeCacheBackend};
pub struct BoundedMemoryBackend {
cache: Cache<String, Bytes>,
}
impl BoundedMemoryBackend {
pub fn new(budget_bytes: usize) -> Self {
let cache: Cache<String, Bytes> = CacheBuilder::new(budget_bytes)
.with_weighter(|_key: &String, value: &Bytes| value.len())
.with_eviction_config(LfuConfig::default())
.build();
Self { cache }
}
pub fn usage(&self) -> usize {
self.cache.usage()
}
}
#[async_trait]
impl RangeCacheBackend for BoundedMemoryBackend {
async fn get(&self, key: &str) -> Option<Bytes> {
self.cache.get(key).map(|entry| entry.value().clone())
}
async fn put(&self, key: String, value: Bytes, _hint: FillHint) {
self.cache.insert(key, value);
}
}