# Redis / Valkey

Redis (and Valkey, AWS's Redis-compatible fork) powers our caching, rate limiting, and job queues.

## What is Redis?

In-memory key-value store optimized for speed. Valkey is AWS's Redis-compatible fork that we use for most deployments.

## Multiple Redis Instances

**File**: `studio_api/studio_api/bots/cache/caches.py`

We run separate Redis instances for different purposes:

1. **Default Cache** (`REDIS_URL`) - General caching
2. **Valkey Instances**:
   - `SESSION_VALKEY_URL` - User sessions
   - `RATELIMIT_VALKEY_URL` - API rate limiting
   - `CLIP_VALKEY_URL` - Clip metadata caching
   - `COMMENTS_VALKEY_URL` - Comment caching
   - `LISTEN_HISTORY_VALKEY_URL` - User listening history
   - `HOOK_COUNTER_BUFFER_VALKEY_URL` - View counters

## Access Patterns

### Django Cache Framework

```python
from studio_api.bots.cache.caches import clip_handler

# Get cached data
clip_data = clip_handler.get(clip_id)
if clip_data is None:
    clip_data = GeneratedClip.objects.get(id=clip_id)
    clip_handler.save(clip_id, clip_data, timeout=3600)
```

### Rate Limiting

```python
from django.core.cache import cache

key = f"rate_limit:{user_id}:{endpoint}"
count = cache.incr(key)
if cache.get(key) is None:
    cache.set(key, 1, timeout=60)
if count > RATE_LIMIT:
    raise RateLimitExceeded()
```

### Redis Queues (for Modal)

```python
from suno_utils.cloud.chirp_backend import ChirpInferenceBackend

backend = ChirpInferenceBackend(deployment_type="prod")
backend.job_queue.put({"clip_id": "abc", "prompt": "happy song"})
```

## Pros

✅ **Extremely Fast** - Sub-millisecond latency

✅ **TTL Support** - Automatic expiration

✅ **Pub/Sub** - Real-time event distribution

✅ **Atomic Operations** - INCR, DECR, SET NX

✅ **Low Latency** - Perfect for rate limiting

## Cons

❌ **Memory-Limited** - Expensive to scale vertically

❌ **Not persisted** - In-memory, data is lost on crash

❌ **No Complex Queries** - Key-value only, no JOINs

❌ **Manual Invalidation** - Need to carefully manage cache invalidation

## When to Use

### ✅ Use Redis for:
- Caching expensive queries
- Rate limiting and throttling
- Temporary data (sessions, recent history)
- Real-time counters (views, plays)
- Job queues

### ❌ Don't use Redis for:
- Data that can't be regenerated
- Data requiring complex queries
- Long-term storage
- Large binary data

