Skip to main content

Cache Invalidator Agent

The Cache Invalidator Agent handles intelligent cache invalidation strategies to maintain data consistency across the platform.

πŸ“‹ Overview​

PropertyValue
Modulesrc.agents.cache.cache_invalidator_agent
ClassCacheInvalidatorAgent
AuthorNguyen Viet Hoang
Version1.0.0

🎯 Purpose​

Cache invalidation ensures data consistency by:

  • Removing stale data when source data changes
  • Propagating updates across distributed cache nodes
  • Maintaining consistency between cache and database
  • Optimizing memory by removing unused entries

πŸ”§ Invalidation Strategies​

Time-Based Invalidation (TTL)​

# Set TTL during caching
cache.set("camera:CAM_001", data, ttl=300) # Expires in 5 minutes

Event-Based Invalidation​

# Invalidate on data change event
invalidator.on_entity_update("camera:CAM_001")
invalidator.on_entity_delete("camera:CAM_001")

Pattern-Based Invalidation​

# Invalidate all matching keys
invalidator.invalidate_pattern("observation:*")
invalidator.invalidate_pattern("camera:CAM_00*")

Dependency-Based Invalidation​

# Invalidate dependent caches
invalidator.invalidate_with_dependencies("camera:CAM_001", [
"observations:CAM_001:*",
"stats:CAM_001:*"
])

πŸ“Š Architecture​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Data Change β”‚
β”‚ Event β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Invalidator │───▢│ Cache Manager β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”΄β”€β”€β”€β”€β”
β–Ό β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”
β”‚ Redis β”‚ β”‚ Local β”‚
β”‚ Cache β”‚ β”‚ Cache β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”˜

πŸš€ Usage​

Basic Invalidation​

from src.agents.cache.cache_invalidator_agent import CacheInvalidatorAgent

invalidator = CacheInvalidatorAgent()

# Invalidate single key
invalidator.invalidate("camera:CAM_001")

# Invalidate multiple keys
invalidator.invalidate_many([
"camera:CAM_001",
"camera:CAM_002"
])

# Invalidate by pattern
invalidator.invalidate_pattern("observation:2025-11-*")

Event-Driven Invalidation​

# Subscribe to entity changes
invalidator.subscribe_to_changes([
"Camera",
"Observation",
"Accident"
])

# Handle change event
def on_camera_update(entity_id: str):
invalidator.invalidate(f"camera:{entity_id}")
invalidator.invalidate_pattern(f"observations:{entity_id}:*")

βš™οΈ Configuration​

# config/cache_config.yaml
cache_invalidation:
enabled: true

# Invalidation strategies
strategies:
time_based:
default_ttl: 3600
camera_ttl: 300
observation_ttl: 60

event_based:
enabled: true
entity_types:
- Camera
- Observation
- Accident
- Congestion

pattern_based:
batch_size: 1000
scan_count: 100

πŸ“ˆ Metrics​

MetricDescription
invalidations_totalTotal invalidation operations
invalidations_by_patternPattern-based invalidations
invalidation_latencyAverage invalidation time
cascade_invalidationsDependency cascade operations

πŸ›‘οΈ Best Practices​

1. Use Specific Keys​

# Good: Specific key
invalidator.invalidate("camera:CAM_001:location")

# Avoid: Broad pattern
invalidator.invalidate_pattern("camera:*")

2. Batch Invalidations​

# Batch for better performance
invalidator.invalidate_many(key_list)

3. Log Invalidations​

# Enable audit logging
invalidator.set_audit_logging(True)

See the complete agents reference for all available agents.