Ingress supports caching to improve performance and reduce load on backend services. You can use in-memory caching or Redis for distributed caching.
Two layers: top-level cache configures the shared ctx.Cache() engine (matcher/DNS, and so on). Optional per-backend backend.cache stores HTTP responses in that same engine when enabled—see below.
By default, Ingress uses in-memory caching:
cache:
ttl: 30 # Cache TTL in seconds (default: 60)This caches routing decisions and other data in memory. The cache is local to each Ingress instance.
For distributed caching across multiple Ingress instances, use Redis:
cache:
ttl: 30
engine: redis
host: 127.0.0.1
port: 6379
password: '123456'
db: 2
prefix: ingress:| Field | Type | Description | Default |
|---|---|---|---|
ttl |
int | Cache TTL in seconds | 60 |
engine |
string | Cache engine: memory or redis |
memory |
host |
string | Redis host (for Redis engine) | 127.0.0.1 |
port |
int | Redis port (for Redis engine) | 6379 |
password |
string | Redis password (for Redis engine) | - |
db |
int | Redis database number (for Redis engine) | 0 |
prefix |
string | Cache key prefix (for Redis engine) | - |
The ttl (Time To Live) determines how long cached items remain valid:
cache:
ttl: 30 # Cache items expire after 30 seconds- Shorter TTL: More up-to-date data, but more backend requests
- Longer TTL: Fewer backend requests, but potentially stale data
Choose a TTL that balances freshness with performance for your use case.
In-memory caching is the simplest option and works well for single-instance deployments:
cache:
ttl: 60Advantages:
- No external dependencies
- Fast access
- Simple configuration
Disadvantages:
- Not shared across instances
- Lost on restart
- Limited by available memory
Redis caching is recommended for multi-instance deployments or when you need persistent caching:
cache:
ttl: 60
engine: redis
host: redis.example.com
port: 6379
password: your-password
db: 0
prefix: ingress:- host: Redis server hostname or IP address
- port: Redis server port (default: 6379)
- password: Redis password (optional, omit if no password)
- db: Redis database number (0-15, default: 0)
- prefix: Prefix for all cache keys (useful for namespacing)
Ingress connects to Redis when it starts. If Redis is unavailable:
- Ingress will log an error
- It may fall back to in-memory caching (depending on configuration)
- Health checks may fail
With a prefix, cache keys are formatted as:
{prefix}{key}
For example, with prefix: ingress:, a host routing cache key match.host:v2:example.com becomes ingress:match.host:v2:example.com. HTTP response cache keys look like ingress:httpcache:v1:<digest>. The v2 segment denotes the matcher cache value shape; it may change in future releases.
Ingress caches:
- Routing Decisions: Host and path matching results
- Service Configurations: Parsed service configurations
- DNS Resolutions: Resolved backend service addresses
- HTTP responses (optional): When
backend.cache.enabled: trueon a backend, eligible GET/HEAD responses for service, handler, and redirect can be stored in the samectx.Cache()backend—see HTTP response cache (backend.cache).
Caching routing decisions is particularly beneficial when:
- You have complex routing rules
- DNS resolution is slow
- Backend service discovery is expensive
Different from top-level cache: the root cache block only chooses Redis vs memory and connection defaults for ctx.Cache(). backend.cache is per route under rules[].backend or paths[].backend.
When cache.enabled: true:
- Service backends cache successful upstream bodies (after buffering) for client GET requests that populate the shared cache key; HEAD can hit the same entry.
- Handler backends cache static responses when storage rules pass (no
Vary, size limits, and so on). - Redirect backends cache the final status and
Locationafter template expansion (GETpopulation path).
Rationale for skipping some responses: Ingress does not store responses with a non-empty Vary header unless cache.skip_vary: true (then Vary is dropped when storing and on cache hits). Without skip_vary, Ingress does not compute separate cache keys per Vary—see the Configuration note. It also skips responses that include Set-Cookie when skip_when_set_cookie is true (default), to avoid caching session-specific payloads. Many public httpbin endpoints return Vary: Origin, so they will not populate the cache unless you opt in with skip_vary and accept a single shared variant.
Details, bypass rules, and field reference: Configuration — backend.cache. Runnable YAML: examples/advanced/http-response-cache.yaml, Redis-backed storage: examples/advanced/redis-cache.yaml.
Cache entries are automatically invalidated when:
- TTL Expires: Entries expire after the configured TTL
- Configuration Reload:
Reloadrunsprepare(), which clears the configured cache backend (same as startup). Stale host entries are therefore removed on reload; rely on TTL for gradual expiry if you rely on external cache tooling. - Manual Invalidation: Some cache entries may be invalidated on specific events
You can monitor cache performance through:
- Cache Hit Rate: Percentage of requests served from cache
- Cache Miss Rate: Percentage of requests that required backend lookup
- Cache Size: Number of items in cache (for in-memory)
- Adjust TTL: Find the right balance between freshness and performance
- Use Redis for Multi-Instance: Share cache across instances
- Monitor Cache Usage: Track hit/miss rates
- Set Appropriate Prefixes: Organize cache keys with prefixes
- Choose the Right Engine: Use in-memory for single instances, Redis for multiple instances
- Set Appropriate TTL: Balance freshness with performance
- Use Redis Prefixes: Namespace cache keys to avoid conflicts
- Monitor Redis: Ensure Redis is available and performing well
- Secure Redis: Use passwords and network security for Redis
- Plan for Cache Misses: Design systems to handle cache misses gracefully
- Verify cache configuration is correct
- Check TTL is set appropriately
- Ensure Redis is accessible (if using Redis)
- Check logs for cache-related errors
- Verify Redis host and port are correct
- Check network connectivity to Redis
- Verify Redis password (if required)
- Ensure Redis is running and accessible
- Consider increasing TTL
- Check if routing rules are too dynamic
- Verify cache is actually being used
- Review cache key patterns
- Monitor memory usage
- Consider reducing TTL if memory is constrained
- Switch to Redis for better memory management
- Review what's being cached