use std::sync::{
Arc,
atomic::{AtomicU64, Ordering},
};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct CacheStatsSnapshot {
pub hits: u64,
pub misses: u64,
pub negative_hits: u64,
pub loader_errors: u64,
pub set_errors: u64,
pub delete_errors: u64,
}
#[derive(Debug, Default)]
struct CacheStatsInner {
hits: AtomicU64,
misses: AtomicU64,
negative_hits: AtomicU64,
loader_errors: AtomicU64,
set_errors: AtomicU64,
delete_errors: AtomicU64,
}
#[derive(Debug, Clone, Default)]
pub struct CacheStats {
inner: Arc<CacheStatsInner>,
}
impl CacheStats {
pub fn record_hit(&self) {
self.inner.hits.fetch_add(1, Ordering::Relaxed);
}
pub fn record_miss(&self) {
self.inner.misses.fetch_add(1, Ordering::Relaxed);
}
pub fn record_negative_hit(&self) {
self.inner.negative_hits.fetch_add(1, Ordering::Relaxed);
}
pub fn record_loader_error(&self) {
self.inner.loader_errors.fetch_add(1, Ordering::Relaxed);
}
pub fn record_set_error(&self) {
self.inner.set_errors.fetch_add(1, Ordering::Relaxed);
}
pub fn record_delete_error(&self) {
self.inner.delete_errors.fetch_add(1, Ordering::Relaxed);
}
pub fn snapshot(&self) -> CacheStatsSnapshot {
CacheStatsSnapshot {
hits: self.inner.hits.load(Ordering::Relaxed),
misses: self.inner.misses.load(Ordering::Relaxed),
negative_hits: self.inner.negative_hits.load(Ordering::Relaxed),
loader_errors: self.inner.loader_errors.load(Ordering::Relaxed),
set_errors: self.inner.set_errors.load(Ordering::Relaxed),
delete_errors: self.inner.delete_errors.load(Ordering::Relaxed),
}
}
}