Bird
Raised Fist0
NestJSframework~5 mins

Custom cache keys in NestJS

Choose your learning style10 modes available
Introduction

Custom cache keys help you control how data is stored and retrieved in the cache. This makes your app faster by reusing saved results exactly when you want.

When you want to cache data for specific users separately.
When caching results of a function that depends on multiple inputs.
When you want to avoid cache conflicts by naming keys clearly.
When you want to customize cache expiration per key.
When you want to debug or monitor cache usage with meaningful keys.
Syntax
NestJS
import { CacheKey, CacheTTL, CacheInterceptor, Controller, Get, UseInterceptors } from '@nestjs/common';

@Controller('items')
@UseInterceptors(CacheInterceptor)
export class ItemsController {
  @Get()
  @CacheKey('custom_key_name')
  @CacheTTL(60) // seconds
  findAll() {
    return ['item1', 'item2'];
  }
}

@CacheKey() sets a custom name for the cache entry.

@CacheTTL() sets how long the cache lasts in seconds.

Examples
This caches the user profile under the key 'user_123_profile'.
NestJS
@CacheKey('user_123_profile')
findUserProfile() {
  return { name: 'Alice', age: 30 };
}
You can use a function to create dynamic cache keys based on input.
NestJS
@CacheKey((pageNumber: number) => `items_page_${pageNumber}`)
findItems(pageNumber: number) {
  return getItems(pageNumber);
}
This caches all products for 2 minutes with a custom key.
NestJS
@CacheKey('all_products')
@CacheTTL(120)
getAllProducts() {
  return fetchProducts();
}
Sample Program

This controller caches the list of books under the key 'books_list' for 30 seconds. The console log shows when the data is fetched fresh.

NestJS
import { CacheKey, CacheTTL, CacheInterceptor, Controller, Get, UseInterceptors } from '@nestjs/common';

@Controller('books')
@UseInterceptors(CacheInterceptor)
export class BooksController {
  private books = ['Book A', 'Book B', 'Book C'];

  @Get()
  @CacheKey('books_list')
  @CacheTTL(30)
  getBooks() {
    console.log('Fetching books from source');
    return this.books;
  }
}
OutputSuccess
Important Notes

Custom cache keys help avoid overwriting cached data accidentally.

Use meaningful keys to make debugging easier.

Remember to set cache TTL to control how fresh your data stays.

Summary

Custom cache keys let you name cached data clearly.

They help store and retrieve data exactly as you want.

Use decorators like @CacheKey() and @CacheTTL() in NestJS.

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