2.5 KiB
2.5 KiB
Redis Configuration
Connection Setup
ioredis client with connection pooling:
import { Redis } from 'ioredis'
const redis = new Redis({
host: process.env.REDIS_HOST || 'localhost',
port: parseInt(process.env.REDIS_PORT || '6379'),
password: process.env.REDIS_PASSWORD,
db: parseInt(process.env.REDIS_DB || '0'),
maxRetriesPerRequest: 3,
retryStrategy: (times) => {
const delay = Math.min(times * 50, 2000)
return delay
},
lazyConnect: true,
})
redis.on('error', (err) => {
console.error('Redis connection error:', err)
})
redis.on('connect', () => {
console.log('Redis connected')
})
export default redis
Serverless Considerations
Redis in serverless environments (Vercel, Lambda):
- Use Redis connection pooling (ioredis handles this)
- Consider Upstash Redis (serverless-optimized)
- Set
lazyConnect: trueto avoid connection on module load - Handle cold starts gracefully (fallback to database)
- Monitor connection count to avoid exhaustion
Upstash example:
import { Redis } from '@upstash/redis'
const redis = new Redis({
url: process.env.UPSTASH_REDIS_REST_URL,
token: process.env.UPSTASH_REDIS_REST_TOKEN,
})
Upstash uses HTTP REST API, avoiding connection pooling issues in serverless.
Cache Implementation Checklist
When implementing caching:
Setup:
- Redis client configured with connection pooling
- Error handling for Redis connection failures
- Fallback to database when Redis unavailable
- Environment variables for Redis configuration
Cache Keys:
- Consistent key naming convention (entity:identifier)
- Hash complex query parameters for deterministic keys
- Namespace keys by entity type
- Document key patterns
Caching Logic:
- Cache-aside pattern (read from cache, fallback to DB)
- Serialize/deserialize with JSON.parse/stringify
- Handle null/undefined results appropriately
- Log cache hits/misses for monitoring
Invalidation:
- Invalidate on create/update/delete mutations
- Handle cascading invalidation for related entities
- Consider bulk invalidation for list queries
- Test invalidation across all mutation paths
TTL Configuration:
- Define TTL for each data type
- Shorter TTL for frequently changing data
- Longer TTL for static/rarely changing data
- Document TTL choices and rationale
Monitoring:
- Track cache hit rate
- Monitor cache memory usage
- Log invalidation events
- Alert on Redis connection failures