Bird
Raised Fist0
NestJSframework~8 mins

Custom cache keys in NestJS - Performance & Optimization

Choose your learning style10 modes available
Performance: Custom cache keys
MEDIUM IMPACT
This affects how efficiently cached data is retrieved and reused, impacting response time and server load.
Caching API responses with unique keys for different query parameters
NestJS
const key = `userData:${userId}`;
cacheManager.set(key, data);
Generates unique keys per user, ensuring correct cached data is served without collisions.
📈 Performance Gainreduces cache misses and server load, improving response speed
Caching API responses with unique keys for different query parameters
NestJS
cacheManager.set('userData', data); // same key for all users
Using a single static cache key causes cache collisions and stale data for different users.
📉 Performance Costcauses frequent cache misses and redundant data fetching, increasing server response time
Performance Comparison
PatternCache HitsCache MissesServer LoadVerdict
Static key for all requestsLowHighHigh[X] Bad
Unique key per request parametersHighLowLow[OK] Good
Rendering Pipeline
Custom cache keys optimize the server response phase by reducing redundant data fetching and processing.
→Server Processing
→Network Response
⚠️ BottleneckCache lookup efficiency and data retrieval
Core Web Vital Affected
INP
This affects how efficiently cached data is retrieved and reused, impacting response time and server load.
Optimization Tips
1Use unique cache keys that reflect request parameters to avoid collisions.
2Avoid static keys for dynamic data to prevent stale cache issues.
3Test cache effectiveness by measuring response times for repeated requests.
Performance Quiz - 3 Questions
Test your performance knowledge
Why is using a static cache key for all requests bad for performance?
AIt causes cache collisions and stale data, increasing server load.
BIt reduces server load by sharing cached data.
CIt improves cache hit rate for all users.
DIt decreases network latency automatically.
DevTools: Network
How to check: Open DevTools Network panel, observe response times for repeated requests with different parameters.
What to look for: Faster responses and fewer full data fetches indicate effective caching with custom keys.

Practice

(1/5)
1. What is the main purpose of using @CacheKey() in a NestJS service?
easy
A. To set the time duration for cache expiration
B. To clear all cached data automatically
C. To define a custom name for the cached data key
D. To disable caching for a method

Solution

  1. Step 1: Understand the role of @CacheKey()

    This decorator is used to specify a custom key name for the cached data instead of using a default or generated key.
  2. Step 2: Differentiate from other cache decorators

    @CacheTTL() sets cache duration, clearing cache is manual or by other methods, and disabling cache is not done by @CacheKey().
  3. Final Answer:

    To define a custom name for the cached data key -> Option C
  4. Quick Check:

    Custom cache key = @CacheKey() [OK]
Hint: Remember: CacheKey sets the cache name, TTL sets time [OK]
Common Mistakes:
  • Confusing @CacheKey() with @CacheTTL()
  • Thinking @CacheKey() clears cache
  • Assuming @CacheKey() disables caching
2. Which of the following is the correct way to apply a custom cache key to a method in NestJS?
easy
A. @CacheKey = 'myKey'\nasync getData() { return data; }
B. @CacheTTL(300)\nasync getData() { return data; }
C. cacheKey('myKey')\nasync getData() { return data; }
D. @CacheKey('myKey')\nasync getData() { return data; }

Solution

  1. Step 1: Identify correct decorator syntax

    In NestJS, decorators are applied with @DecoratorName(parameters) syntax above the method.
  2. Step 2: Check each option

    @CacheKey('myKey')\nasync getData() { return data; } uses @CacheKey('myKey') correctly. @CacheTTL(300)\nasync getData() { return data; } uses @CacheTTL which sets time, not key. @CacheKey = 'myKey'\nasync getData() { return data; } uses invalid assignment syntax. cacheKey('myKey')\nasync getData() { return data; } uses a non-existent function.
  3. Final Answer:

    @CacheKey('myKey')\nasync getData() { return data; } -> Option D
  4. Quick Check:

    Decorator syntax = @CacheKey('key') [OK]
Hint: Decorators start with @ and parentheses for parameters [OK]
Common Mistakes:
  • Using assignment instead of decorator syntax
  • Mixing @CacheKey with @CacheTTL
  • Calling cacheKey as a function instead of decorator
3. Given this NestJS method with caching:
@CacheKey('userList')
@CacheTTL(60)
async getUsers() {
  return ['Alice', 'Bob'];
}

What will be the cache key and TTL for the cached data?
medium
A. Key: 'getUsers', TTL: default (no TTL set)
B. Key: 'userList', TTL: 60 seconds
C. Key: 'userList', TTL: default (no TTL set)
D. Key: 'getUsers', TTL: 60 seconds

Solution

  1. Step 1: Identify the cache key from @CacheKey()

    The decorator @CacheKey('userList') sets the cache key explicitly to 'userList'.
  2. Step 2: Identify the TTL from @CacheTTL()

    The decorator @CacheTTL(60) sets the cache time to 60 seconds.
  3. Final Answer:

    Key: 'userList', TTL: 60 seconds -> Option B
  4. Quick Check:

    Custom key + TTL = 'userList' & 60s [OK]
Hint: @CacheKey sets key, @CacheTTL sets time in seconds [OK]
Common Mistakes:
  • Assuming method name is cache key when @CacheKey is used
  • Ignoring @CacheTTL and thinking no TTL is set
  • Confusing TTL units (seconds vs milliseconds)
4. You wrote this code:
@CacheKey('dataKey')
@CacheTTL('300')
async fetchData() {
  return 'info';
}

Why does the cache TTL not work as expected?
medium
A. Because TTL value should be a number, not a string
B. Because @CacheKey must come after @CacheTTL
C. Because async methods cannot use caching decorators
D. Because the cache key 'dataKey' is invalid

Solution

  1. Step 1: Check the @CacheTTL parameter type

    The TTL decorator expects a number (seconds), but '300' is a string, which causes it to fail.
  2. Step 2: Verify other decorator rules

    Decorator order does not affect TTL, async methods support caching, and 'dataKey' is a valid string key.
  3. Final Answer:

    Because TTL value should be a number, not a string -> Option A
  4. Quick Check:

    TTL must be number, not string [OK]
Hint: TTL needs number type, not quoted string [OK]
Common Mistakes:
  • Passing TTL as string instead of number
  • Thinking decorator order matters here
  • Assuming async disables caching
5. You want to cache user data with a dynamic key based on user ID. Which approach correctly creates a custom cache key in NestJS for method getUserById(id: string)?
hard
A. Use @CacheKey(() => `user_${id}`) above the method
B. Manually generate the key inside the method and use @CacheKey() without parameters
C. Use @CacheKey('user_' + id) directly above the method
D. Use @CacheKey() and pass the key as a method argument

Solution

  1. Step 1: Understand dynamic cache keys in NestJS

    To create a dynamic cache key, you can pass a function to @CacheKey() that returns the key string using method parameters.
  2. Step 2: Evaluate each option

    Use @CacheKey(() => `user_${id}`) above the method correctly uses a function returning a template string with id. Manually generate the key inside the method and use @CacheKey() without parameters is invalid because @CacheKey() needs the key at decoration time. Use @CacheKey('user_' + id) directly above the method tries to concatenate directly but id is not available at decoration time. Use @CacheKey() and pass the key as a method argument is invalid as @CacheKey() does not accept method arguments.
  3. Final Answer:

    Use @CacheKey(() => `user_${id}`) above the method -> Option A
  4. Quick Check:

    Dynamic key = function in @CacheKey() [OK]
Hint: Use function in @CacheKey() for dynamic keys [OK]
Common Mistakes:
  • Trying to use method parameters directly in decorator string
  • Assuming @CacheKey() accepts method arguments
  • Generating key inside method but not linking to cache
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard