Caching & Redis Standards
Priority: P1 (OPERATIONAL)
Caching strategies and Redis integration patterns for high-performance NestJS applications.
Caching Strategy
- Layering: Use Multi-Level Caching for high-traffic read endpoints.
- L1 (Local): In-Memory (Node.js heap). Ultra-fast, no network. Use
lru-cachefor config/static data. - L2 (Distributed): Redis. Shared across pods.
- L1 (Local): In-Memory (Node.js heap). Ultra-fast, no network. Use
- Pattern: Implement Stale-While-Revalidate to avoid latency spikes during cache misses.
NestJS Implementation
- Library: Use
cache-managerwithcache-manager-redis-yet(recommended overcache-manager-redis-storefor V4 stability). - Interceptors: Use
@UseInterceptors(CacheInterceptor)for simple GET responses.- Warning: Default key is the URL. Ensure consistent query param ordering or use custom key generators.
Stampede Protection
- Jitter: Add random variance to TTLs to prevent simultaneous expiry across keys.
- Locking: One process recomputes while others wait or return stale data.
Redis Data Structures
- Hash (
HSET): Store objects (user profiles) with partial update support. - Set (
SADD): Unique collections with O(1) membership checks. - Sorted Set (
ZADD): Priority queues, leaderboards, rate-limiting windows.
Invalidation Patterns
- Tagging: Use Sets to group cache keys (avoid
KEYSwhich is O(N) in production).- Create:
SADD post:1:tags cache:post:1 - Invalidate: Fetch tags from Set, then
DELthe grouped keys.
- Create:
- Event-Driven: Listen to domain events (
UserUpdated) to trigger invalidation asynchronously.
Anti-Patterns
- No KEYS in production: Use SET-based tag grouping for cache invalidation; KEYS is O(N).
- No fixed TTLs on grouped caches: Add jitter (±10s) to prevent simultaneous stampede.
- No MemoryStorage for multi-pod: Use Redis store; in-memory cache is not shared across pods.