# Cache Plugin Configuration Guide

## Overview

The Cache plugin in lazydns provides DNS response caching with advanced features like lazy refresh, stale-serving, and prefetching. This guide explains all configuration options and how to optimize caching for your DNS server.

## Configuration Options

### Basic Settings

#### `size`

- **Type**: Integer
- **Default**: 1024
- **Description**: Maximum number of cached entries. When the cache reaches this limit, the least recently used (LRU) entries are evicted.
- **Example**: `size: 2048`

#### `negative_cache`

- **Type**: Boolean
- **Default**: true
- **Description**: Whether to cache negative responses (NXDOMAIN, SERVFAIL, etc.). Enabling this reduces load on upstream servers for non-existent domains.
- **Example**: `negative_cache: false`

#### `negative_ttl`

- **Type**: Integer (seconds)
- **Default**: 300
- **Description**: Time-to-live for cached negative responses.
- **Example**: `negative_ttl: 600`

### LazyCache Features

#### `enable_lazycache`

- **Type**: Boolean
- **Default**: false
- **Description**: Enables proactive refresh of cached entries before they expire. When a cached entry is accessed and its remaining TTL falls below the threshold, a background refresh is triggered.
- **Example**: `enable_lazycache: true`

#### `lazycache_threshold`

- **Type**: Float (0.0-1.0)
- **Default**: 0.05
- **Description**: Threshold for triggering lazy refresh. Refresh occurs when remaining TTL percentage drops below this value (e.g., 0.05 = 5% of original TTL).
- **Example**: `lazycache_threshold: 0.1`

### Stale-Serving (Extended Cache TTL)

#### `cache_ttl`

- **Type**: Integer (seconds)
- **Default**: Not set (disabled)
- **Description**: Enables stale-serving with extended cache duration. When DNS message TTL expires but cache TTL remains, serves stale response with small TTL (5 seconds) and refreshes in background. Set to desired cache duration (e.g., 600 for 10 minutes).
- **Example**: `cache_ttl: 600`

### Prefetch (Experimental)

#### `enable_prefetch`

- **Type**: Boolean
- **Default**: false
- **Description**: Enables prefetching for more aggressive caching. **Note**: This feature is currently experimental and may be removed or changed in future versions.
- **Example**: `enable_prefetch: true`

#### `prefetch_threshold`

- **Type**: Float (0.0-1.0)
- **Default**: 0.1
- **Description**: Threshold for triggering prefetch refresh (more aggressive than lazycache).
- **Example**: `prefetch_threshold: 0.2`

## Example Configurations

### Basic Cache

```yaml
- tag: cache
  type: cache
  args:
    size: 1024
    negative_cache: true
    negative_ttl: 300
```

### With LazyCache

```yaml
- tag: cache
  type: cache
  args:
    size: 2048
    negative_cache: true
    negative_ttl: 300
    enable_lazycache: true
    lazycache_threshold: 0.05
```

### With Stale-Serving

```yaml
- tag: cache
  type: cache
  args:
    size: 1024
    negative_cache: true
    negative_ttl: 300
    enable_lazycache: false # Disable to test stale-serving
    cache_ttl: 600
```

### High-Performance Cache

```yaml
- tag: cache
  type: cache
  args:
    size: 5000
    negative_cache: true
    negative_ttl: 600
    enable_lazycache: true
    lazycache_threshold: 0.1
    cache_ttl: 1800
```

## Best Practices

### Memory Usage

- Start with `size: 1024` and monitor memory usage.
- Increase size for high-traffic servers, but watch for memory pressure.
- Consider `negative_cache: false` if you prefer to re-query failed domains.

### Performance Tuning

- Enable `enable_lazycache` for hot domains to reduce latency.
- Use lower `lazycache_threshold` (e.g., 0.02) for more aggressive refresh.
- Set `cache_ttl` to 2-3x typical DNS TTL for stale-serving benefits.

### Monitoring

- Monitor cache hit rates and refresh statistics via admin API (`/api/cache/control`).
- Watch logs for cache misses and refresh activities.
- Use metrics endpoint for Prometheus integration.

## Troubleshooting

### Common Issues

**High Cache Miss Rate**

- Increase `size` if cache is full.
- Check if domains are being skipped (e.g., via `!qname` conditions).

**Stale Responses Not Working**

- Ensure `cache_ttl` is set and greater than message TTL.
- Disable `enable_lazycache` to isolate stale-serving behavior.
- Wait for message TTL to expire before testing.

**Memory Issues**

- Reduce `size` or disable `negative_cache`.
- Monitor via `top` or admin API.

### Log Messages

- `Cache hit`: Normal cache hit.
- `Lazycache threshold REACHED`: Proactive refresh triggered.
- `LazyCache TTL hit (stale entry)`: Stale-serving activated.
- `Storing response in cache`: New entry cached with TTL info.

## Advanced Usage

### Conditional Caching

Use sequence conditions to skip caching for specific domains:

```yaml
- matches: "!qname example.com"
  exec: $cache
```

### Integration with Other Plugins

Cache works well with:

- `hosts`: Cache static responses.
- `forward`: Cache upstream responses.
- `ttl`: Modify TTLs before caching.

## Migration from Other DNS Servers

If migrating from other DNS servers:

- **Unbound**: Similar to `rrset-cache-size` and `msg-cache-size`.
- **Bind9**: Compare to `max-cache-size` and `max-ncache-ttl`.
- **mosdns**: `cache_ttl` replaces `lazy_cache_ttl`.

Adjust sizes based on your query patterns and available memory.
