#![warn(missing_docs)]
#![deny(unsafe_code)]
pub mod analytics;
pub mod coherency;
pub mod compression;
pub mod distributed;
pub mod error;
pub mod eviction;
pub mod multi_tier;
pub mod observability;
pub mod partitioning;
pub mod predictive;
pub mod tiering;
pub mod warming;
pub mod write_policy;
pub use error::{CacheError, Result};
pub use multi_tier::{CacheKey, CacheTier, CacheValue, MultiTierCache};
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CacheStats {
pub hits: u64,
pub misses: u64,
pub evictions: u64,
pub bytes_stored: u64,
pub item_count: usize,
}
impl CacheStats {
pub fn new() -> Self {
Self {
hits: 0,
misses: 0,
evictions: 0,
bytes_stored: 0,
item_count: 0,
}
}
pub fn hit_rate(&self) -> f64 {
if self.hits + self.misses == 0 {
0.0
} else {
(self.hits as f64) / ((self.hits + self.misses) as f64) * 100.0
}
}
pub fn avg_item_size(&self) -> f64 {
if self.item_count == 0 {
0.0
} else {
(self.bytes_stored as f64) / (self.item_count as f64)
}
}
}
impl Default for CacheStats {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CacheConfig {
pub l1_size: usize,
pub l2_size: usize,
pub l3_size: usize,
pub enable_compression: bool,
pub enable_prefetch: bool,
pub enable_distributed: bool,
pub cache_dir: Option<std::path::PathBuf>,
}
impl Default for CacheConfig {
fn default() -> Self {
Self {
l1_size: 128 * 1024 * 1024, l2_size: 1024 * 1024 * 1024, l3_size: 10 * 1024 * 1024 * 1024, enable_compression: true,
enable_prefetch: true,
enable_distributed: false,
cache_dir: None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cache_stats_hit_rate() {
let mut stats = CacheStats::new();
stats.hits = 80;
stats.misses = 20;
approx::assert_relative_eq!(stats.hit_rate(), 80.0, epsilon = 0.01);
}
#[test]
fn test_cache_stats_avg_size() {
let mut stats = CacheStats::new();
stats.bytes_stored = 1000;
stats.item_count = 10;
approx::assert_relative_eq!(stats.avg_item_size(), 100.0, epsilon = 0.01);
}
#[test]
fn test_default_config() {
let config = CacheConfig::default();
assert!(config.enable_compression);
assert!(config.enable_prefetch);
assert!(!config.enable_distributed);
}
}