Cache Control
Views implement intelligent caching to minimize unnecessary data refreshes while keeping data reasonably fresh. Cache control settings help you balance data freshness with performance.
Overview
When a view is requested, the system follows this process:
- Check cache validity - Is the cached data still fresh?
- Return or refresh - If fresh, return cached data; if stale, trigger a refresh
- Handle refresh timeout - If refresh takes too long, return stale data instead
- Store results - New data is cached for subsequent requests
Configuration
Cache is configured in the view's spec section:
apiVersion: mission-control.flanksource.com/v1
kind: View
metadata:
name: my-view
spec:
cache:
# Maximum age before cache is considered stale (default: 15m)
maxAge: 15m
# Minimum age a user can request refresh (default: 10s)
# Prevents over-refreshing from rapid user requests
minAge: 10s
# Timeout for refresh operations (default: 5s)
# If refresh takes longer, stale data is returned instead
refreshTimeout: 5s
Cache Parameters
maxAge
The maximum age of cached data before it's considered stale and needs refresh.
- Default:
15m - Format: Go duration (e.g.,
5m,1h,30s) - Effect: Determines how fresh your data is
- Shorter duration: More frequent refreshes, fresher data, higher load
- Longer duration: Less frequent refreshes, potentially stale data, lower load
Example:
cache:
maxAge: 5m # Refresh at least every 5 minutes
minAge
The minimum age cached data must reach before a user can request a manual refresh. This prevents over-refreshing from rapid user clicks.
- Default:
10s - Format: Go duration
- Effect: Throttles refresh requests from users
- Users cannot force a refresh faster than this interval
- Helps prevent accidental load spikes from aggressive clicking
Example:
cache:
minAge: 30s # Users can only refresh every 30 seconds
refreshTimeout
How long to wait for a refresh operation to complete. If the refresh takes longer, stale data is returned instead of waiting.
- Default:
5s - Format: Go duration
- Effect: Ensures response times don't degrade when refresh is slow
- Shorter timeout: Faster responses, but may return stale data
- Longer timeout: Fresher data, but slower responses if refresh is slow
Example:
cache:
refreshTimeout: 2s # Return stale data if refresh takes > 2 seconds
Per-Variable Caching
Each unique combination of template variables creates a separate cache entry. This allows different filters to maintain independent cache lifespans.
Example: A view with a "cluster" variable will maintain separate cached data for:
- cluster=us-east-1
- cluster=us-west-2
- cluster=eu-central-1
Each cluster's data is cached independently, allowing users to switch between clusters without invalidating other cached results.
Cache Behavior Examples
Example 1: Fresh Data Request
User requests view
↓
Cache check: Data is 5 minutes old, maxAge=15m
↓
Cache is valid → Return cached data immediately
↓
Response time: ~10ms
Example 2: Stale Data with Quick Refresh
User requests view
↓
Cache check: Data is 20 minutes old, maxAge=15m
↓
Cache is stale → Trigger refresh with 2s timeout
↓
Refresh completes in 1.5 seconds
↓
Return fresh data → Cache updated
↓
Response time: ~1.5s
Example 3: Stale Data with Slow Refresh
User requests view
↓
Cache check: Data is 20 minutes old, maxAge=15m
↓
Cache is stale → Trigger refresh with 2s timeout
↓
Refresh takes 4 seconds (slower than timeout)
↓
Timeout triggers after 2 seconds
↓
Return stale cached data instead of waiting
↓
Response time: ~2s
↓
Refresh continues in background, updates cache
Example 4: Manual Refresh Throttling
User clicks refresh button
↓
Check minAge: Last refresh was 2 seconds ago, minAge=10s
↓
Too soon → Ignore refresh request
↓
User must wait 8 more seconds before refresh is allowed
Recommended Settings
High-Frequency Monitoring (Every Minute)
Use shorter cache times for real-time dashboards:
cache:
maxAge: 1m
minAge: 10s
refreshTimeout: 5s
Typical Dashboard (Every 5-15 Minutes)
Standard balance of freshness and performance:
cache:
maxAge: 15m
minAge: 30s
refreshTimeout: 5s
Low-Frequency Reference Data (Hourly)
For relatively static data:
cache:
maxAge: 1h
minAge: 1m
refreshTimeout: 10s
Real-Time Critical (Seconds)
For mission-critical live data:
cache:
maxAge: 30s
minAge: 5s
refreshTimeout: 2s
Performance Impact
Cache settings directly affect system performance:
| Setting | ↓ Latency | ↓ Load | ↓ Freshness |
|---|---|---|---|
| Shorter maxAge | ✗ | ✗ | ✓ |
| Longer maxAge | ✓ | ✓ | ✗ |
| Shorter refreshTimeout | ✓ | ✗ | ✗ |
| Longer refreshTimeout | ✗ | ✓ | ✓ |
| Higher minAge | ✓ | ✓ | ✗ |
| Lower minAge | ✗ | ✗ | ✓ |
Default Configuration
If you don't specify cache settings, Mission Control uses these defaults:
cache:
maxAge: 15m # Refresh at least every 15 minutes
minAge: 10s # Throttle user refreshes to every 10 seconds
refreshTimeout: 5s # Return stale data if refresh takes > 5 seconds
These defaults work well for most use cases and provide a good balance between data freshness and system performance.
Cache Deduplication
Mission Control uses singleflight deduplication to prevent multiple concurrent refresh requests for the same view and variable combination. This means:
- If 10 users request the same view at the same time
- Only one database query is executed
- All 10 users receive the same cached result
- Significantly reduces database load
Cache Storage
View cache data is stored in:
- Primary storage: PostgreSQL database (persistent)
- Format:
view_<namespace>_<name>table per view - Tracking: Request fingerprint (SHA256 hash of variable map) identifies unique variable combinations
This allows:
- Data to survive service restarts
- PostgREST API access to view data
- Historical tracking of different variable combinations