1use std::sync::{
2 Arc,
3 atomic::{AtomicU64, Ordering},
4};
5
6#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
8pub struct CacheStatsSnapshot {
9 pub hits: u64,
11 pub misses: u64,
13 pub negative_hits: u64,
15 pub loader_errors: u64,
17 pub set_errors: u64,
19 pub delete_errors: u64,
21}
22
23#[derive(Debug, Default)]
24struct CacheStatsInner {
25 hits: AtomicU64,
26 misses: AtomicU64,
27 negative_hits: AtomicU64,
28 loader_errors: AtomicU64,
29 set_errors: AtomicU64,
30 delete_errors: AtomicU64,
31}
32
33#[derive(Debug, Clone, Default)]
35pub struct CacheStats {
36 inner: Arc<CacheStatsInner>,
37}
38
39impl CacheStats {
40 pub fn record_hit(&self) {
42 self.inner.hits.fetch_add(1, Ordering::Relaxed);
43 }
44
45 pub fn record_miss(&self) {
47 self.inner.misses.fetch_add(1, Ordering::Relaxed);
48 }
49
50 pub fn record_negative_hit(&self) {
52 self.inner.negative_hits.fetch_add(1, Ordering::Relaxed);
53 }
54
55 pub fn record_loader_error(&self) {
57 self.inner.loader_errors.fetch_add(1, Ordering::Relaxed);
58 }
59
60 pub fn record_set_error(&self) {
62 self.inner.set_errors.fetch_add(1, Ordering::Relaxed);
63 }
64
65 pub fn record_delete_error(&self) {
67 self.inner.delete_errors.fetch_add(1, Ordering::Relaxed);
68 }
69
70 pub fn snapshot(&self) -> CacheStatsSnapshot {
72 CacheStatsSnapshot {
73 hits: self.inner.hits.load(Ordering::Relaxed),
74 misses: self.inner.misses.load(Ordering::Relaxed),
75 negative_hits: self.inner.negative_hits.load(Ordering::Relaxed),
76 loader_errors: self.inner.loader_errors.load(Ordering::Relaxed),
77 set_errors: self.inner.set_errors.load(Ordering::Relaxed),
78 delete_errors: self.inner.delete_errors.load(Ordering::Relaxed),
79 }
80 }
81}