Caching & Redis Standards
Priority: P1 (OPERATIONAL)
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.
- 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 URL. Ensure consistent query param ordering or use custom key generators.
See implementation examples
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.
See implementation examples
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 O(N) in production). - Create:
SADD post:1:tags cache:post:1 - Invalidate: Fetch tags from Set, then
DELgrouped keys. - 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 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 not shared across pods.