do_memory_storage_turso/cache/
config.rs1use std::time::Duration;
4
5#[derive(Debug, Clone)]
7pub struct CacheConfig {
8 pub enable_episode_cache: bool,
10
11 pub enable_pattern_cache: bool,
13
14 pub enable_query_cache: bool,
16
17 pub max_episodes: usize,
19
20 pub max_patterns: usize,
22
23 pub max_query_results: usize,
25
26 pub episode_ttl: Duration,
28
29 pub pattern_ttl: Duration,
31
32 pub query_ttl: Duration,
34
35 pub min_ttl: Duration,
37
38 pub max_ttl: Duration,
40
41 pub hot_threshold: usize,
43
44 pub cold_threshold: usize,
46
47 pub adaptation_rate: f64,
49
50 pub enable_background_cleanup: bool,
52
53 pub cleanup_interval_secs: u64,
55}
56
57impl Default for CacheConfig {
58 fn default() -> Self {
59 Self {
60 enable_episode_cache: true,
61 enable_pattern_cache: true,
62 enable_query_cache: true,
63 max_episodes: 10_000,
64 max_patterns: 5_000,
65 max_query_results: 1_000,
66 episode_ttl: Duration::from_secs(1800), pattern_ttl: Duration::from_secs(3600), query_ttl: Duration::from_secs(300), min_ttl: Duration::from_secs(60), max_ttl: Duration::from_secs(7200), hot_threshold: 10,
72 cold_threshold: 2,
73 adaptation_rate: 0.25,
74 enable_background_cleanup: true,
75 cleanup_interval_secs: 60,
76 }
77 }
78}
79
80#[derive(Debug, Clone, Default)]
82pub struct CacheStats {
83 pub episode_hits: u64,
85
86 pub episode_misses: u64,
88
89 pub pattern_hits: u64,
91
92 pub pattern_misses: u64,
94
95 pub query_hits: u64,
97
98 pub query_misses: u64,
100
101 pub evictions: u64,
103
104 pub expirations: u64,
106}
107
108impl CacheStats {
109 pub fn hit_rate(&self) -> f64 {
111 let total_hits = self.episode_hits + self.pattern_hits + self.query_hits;
112 let total_requests =
113 total_hits + self.episode_misses + self.pattern_misses + self.query_misses;
114
115 if total_requests == 0 {
116 0.0
117 } else {
118 total_hits as f64 / total_requests as f64
119 }
120 }
121
122 pub fn episode_hit_rate(&self) -> f64 {
124 let total = self.episode_hits + self.episode_misses;
125 if total == 0 {
126 0.0
127 } else {
128 self.episode_hits as f64 / total as f64
129 }
130 }
131
132 pub fn pattern_hit_rate(&self) -> f64 {
134 let total = self.pattern_hits + self.pattern_misses;
135 if total == 0 {
136 0.0
137 } else {
138 self.pattern_hits as f64 / total as f64
139 }
140 }
141
142 pub fn query_hit_rate(&self) -> f64 {
144 let total = self.query_hits + self.query_misses;
145 if total == 0 {
146 0.0
147 } else {
148 self.query_hits as f64 / total as f64
149 }
150 }
151}