> nestjs-caching
Multi-level caching, Invalidation patterns, and Stampede protection. Use when implementing multi-level caching or cache invalidation strategies in NestJS. (triggers: **/*.service.ts, **/*.interceptor.ts, CacheInterceptor, CacheTTL, Redis, stale-while-revalidate)
curl "https://skillshub.wtf/HoangNguyen0403/agent-skills-standard/nestjs-caching?format=md"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. Ideal for config/static data. Use
lru-cache. - L2 (Distributed): Redis. Shared across pods.
- L1 (Local): In-Memory (Node.js heap). Ultra-fast, no network. Ideal for config/static data. Use
- Pattern: Implement Stale-While-Revalidate where possible to avoid latency spikes during cache misses.
NestJS Implementation
-
Library: Use
cache-managerwithcache-manager-redis-yet(Recommended overcache-manager-redis-storefor better V4 support and stability). -
Interceptors: Use
@UseInterceptors(CacheInterceptor)for simple GET responses.- Warning: By default, this uses the URL as the key. Ensure consistent query param ordering or custom key generators.
-
Decorators: Standardize custom cache keys.
@CacheKey('users_list') @CacheTTL(300) // 5 minutes findAll() { ... }
Redis Data Structures (Expert)
- Don't just use
GET/SET. - Hash (
HSET): Storing objects (User profiles). Allows partial updates (HSET user:1 lastLogin result) without serialization overhead. - Set (
SADD): Unique collections (e.g., "Online User IDs"). O(1) membership checks. - Sorted Set (
ZADD): Priority queues, Leaderboards, or Rate Limiting windows.
Invalidation Patterns
- Problem: "There are only two hard things in Computer Science: cache invalidation and naming things."
- Tagging: Since Redis doesn't support wildcards efficiently (
KEYSis O(N) - bans in PROD), use Sets to group keys.- Create:
SADD post:1:tags cache:post:1 - Invalidate: Fetch tags from Set, then
DELusage keys.
- Create:
- Event-Driven: Listen to Domain Events (
UserUpdated) to trigger invalidation asynchronously.
Stampede Protection
- Jitter: Add random variance to TTLs (e.g., 300s ± 10s) to prevent all keys expiring simultaneously.
- Locking: If a key is missing, one process computes it while others wait or return stale. (Complex, often handled by
swrlibraries).
🚫 Anti-Patterns
- Do NOT use standard patterns if specific project rules exist.
- Do NOT ignore error handling or edge cases.
> related_skills --same-repo
> typescript-tooling
Development tools, linting, and build config for TypeScript. Use when configuring ESLint, Prettier, Jest, Vitest, tsconfig, or any TS build tooling. (triggers: tsconfig.json, .eslintrc.*, jest.config.*, package.json, eslint, prettier, jest, vitest, build, compile, lint)
> typescript-security
Secure coding practices for TypeScript. Use when validating input, handling auth tokens, sanitizing data, or managing secrets and sensitive configuration. (triggers: **/*.ts, **/*.tsx, validate, sanitize, xss, injection, auth, password, secret, token)
> typescript-language
Modern TypeScript standards for type safety and maintainability. Use when working with types, interfaces, generics, enums, unions, or tsconfig settings. (triggers: **/*.ts, **/*.tsx, tsconfig.json, type, interface, generic, enum, union, intersection, readonly, const, namespace)
> typescript-best-practices
Idiomatic TypeScript patterns for clean, maintainable code. Use when writing or refactoring TypeScript classes, functions, modules, or async logic. (triggers: **/*.ts, **/*.tsx, class, function, module, import, export, async, promise)