use cachekit::builder::{CacheBuilder, CachePolicy};
fn main() {
println!("=== S3-FIFO Cache Example ===\n");
let mut cache = CacheBuilder::new(10).build::<u64, String>(CachePolicy::S3Fifo {
small_ratio: 0.1,
ghost_ratio: 0.9,
});
println!("Created S3-FIFO cache: capacity={}\n", cache.capacity());
for i in 1..=5 {
cache.insert(i, format!("value-{}", i));
}
println!("Inserted keys 1-5 (all in Small queue)");
println!(" len: {}", cache.len());
cache.get(&1);
cache.get(&2);
println!("\nAccessed keys 1 and 2 (frequency increased)");
for i in 6..=10 {
cache.insert(i, format!("value-{}", i));
}
println!("Inserted keys 6-10");
println!(" len: {}", cache.len());
cache.insert(11, "value-11".to_string());
cache.insert(12, "value-12".to_string());
println!("\nAfter inserting keys 11, 12:");
println!(
" contains 1? {} (was accessed, promoted to Main)",
cache.contains(&1)
);
println!(
" contains 2? {} (was accessed, promoted to Main)",
cache.contains(&2)
);
println!(" len: {}", cache.len());
println!("\n=== Scan Resistance Demo ===\n");
let mut cache = CacheBuilder::new(10).build::<u64, String>(CachePolicy::S3Fifo {
small_ratio: 0.1,
ghost_ratio: 0.9,
});
cache.insert(1, "hot-1".to_string());
cache.insert(2, "hot-2".to_string());
cache.insert(3, "hot-3".to_string());
for _ in 0..3 {
cache.get(&1);
cache.get(&2);
cache.get(&3);
}
println!("Inserted and accessed hot items: 1, 2, 3 (freq=3)");
println!("Simulating scan with items 100-120...");
for i in 100..=120 {
cache.insert(i, format!("scan-{}", i));
}
println!("\nAfter scan (21 one-time insertions):");
println!(" contains hot-1? {}", cache.contains(&1));
println!(" contains hot-2? {}", cache.contains(&2));
println!(" contains hot-3? {}", cache.contains(&3));
println!(" len: {}", cache.len());
let scan_items_remaining: Vec<_> = (100..=120).filter(|&i| cache.contains(&i)).collect();
println!(" scan items remaining: {:?}", scan_items_remaining);
println!("\n=== Ghost-Guided Admission Demo ===\n");
let mut cache = CacheBuilder::new(5).build::<u64, String>(CachePolicy::S3Fifo {
small_ratio: 0.2,
ghost_ratio: 1.0, });
for i in 1..=5 {
cache.insert(i, format!("value-{}", i));
}
println!("Filled cache with keys 1-5");
cache.insert(6, "value-6".to_string());
println!("Inserted key 6, key 1 evicted (recorded in Ghost)");
println!(" contains 1? {}", cache.contains(&1));
cache.insert(1, "value-1-reinserted".to_string());
println!("\nRe-inserted key 1 (should go to Main due to ghost hit)");
println!(" contains 1? {}", cache.contains(&1));
for i in 10..=15 {
cache.insert(i, format!("value-{}", i));
}
println!("\nAfter inserting keys 10-15:");
println!(
" contains 1? {} (was promoted to Main via ghost)",
cache.contains(&1)
);
println!(" len: {}", cache.len());
}