Skip to main content

do_memory_storage_turso/cache/
config.rs

1//! Cache configuration types
2
3use std::time::Duration;
4
5/// Configuration for Turso storage caching
6#[derive(Debug, Clone)]
7pub struct CacheConfig {
8    /// Enable episode caching
9    pub enable_episode_cache: bool,
10
11    /// Enable pattern caching
12    pub enable_pattern_cache: bool,
13
14    /// Enable query result caching
15    pub enable_query_cache: bool,
16
17    /// Maximum number of cached episodes
18    pub max_episodes: usize,
19
20    /// Maximum number of cached patterns
21    pub max_patterns: usize,
22
23    /// Maximum number of cached query results
24    pub max_query_results: usize,
25
26    /// Default TTL for episodes
27    pub episode_ttl: Duration,
28
29    /// Default TTL for patterns
30    pub pattern_ttl: Duration,
31
32    /// Default TTL for query results
33    pub query_ttl: Duration,
34
35    /// Minimum TTL for adaptive cache
36    pub min_ttl: Duration,
37
38    /// Maximum TTL for adaptive cache
39    pub max_ttl: Duration,
40
41    /// Hot threshold for adaptive TTL (accesses to be considered "hot")
42    pub hot_threshold: usize,
43
44    /// Cold threshold for adaptive TTL
45    pub cold_threshold: usize,
46
47    /// TTL adaptation rate (0.0 - 1.0)
48    pub adaptation_rate: f64,
49
50    /// Enable background cleanup
51    pub enable_background_cleanup: bool,
52
53    /// Cleanup interval in seconds
54    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), // 30 minutes
67            pattern_ttl: Duration::from_secs(3600), // 1 hour
68            query_ttl: Duration::from_secs(300),    // 5 minutes
69            min_ttl: Duration::from_secs(60),       // 1 minute
70            max_ttl: Duration::from_secs(7200),     // 2 hours
71            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/// Cache statistics
81#[derive(Debug, Clone, Default)]
82pub struct CacheStats {
83    /// Episode cache hits
84    pub episode_hits: u64,
85
86    /// Episode cache misses
87    pub episode_misses: u64,
88
89    /// Pattern cache hits
90    pub pattern_hits: u64,
91
92    /// Pattern cache misses
93    pub pattern_misses: u64,
94
95    /// Query cache hits
96    pub query_hits: u64,
97
98    /// Query cache misses
99    pub query_misses: u64,
100
101    /// Total cache evictions
102    pub evictions: u64,
103
104    /// Total cache expirations
105    pub expirations: u64,
106}
107
108impl CacheStats {
109    /// Calculate overall cache hit rate
110    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    /// Calculate episode cache hit rate
123    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    /// Calculate pattern cache hit rate
133    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    /// Calculate query cache hit rate
143    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}