Skip to main content

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:

  1. Check cache validity - Is the cached data still fresh?
  2. Return or refresh - If fresh, return cached data; if stale, trigger a refresh
  3. Handle refresh timeout - If refresh takes too long, return stale data instead
  4. 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

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