Chuyển tới nội dung chính

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.