キャッシュは、アプリケーションのパフォーマンスとスケーラビリティを向上させるための基本的な技術です。 Nest.js では、組み込みのキャッシュ マネージャーを使用してキャッシュをシームレスに統合できます。この記事では、カスタム @Cacheable デコレータを作成して、Nest.js サービスまたはコントローラでのキャッシュを簡素化する方法を説明します。
Nest.js はすぐに使用できる強力なキャッシュ メカニズムを提供しますが、メソッド内にキャッシュ ロジックを直接適用するとコードが煩雑になる可能性があります。カスタム デコレータはこのロジックを抽象化し、コードをよりクリーンで保守しやすくします。
メソッドの結果をキャッシュするために使用する @Cacheable デコレーターを作成することから始めましょう。
import { Cache } from 'cache-manager'; export function Cacheable(cacheKey: string) { return function ( target: any, propertyName: string, descriptor: PropertyDescriptor, ) { const originalMethod = descriptor.value; descriptor.value = async function (...args: any[]) { const cache: Cache = this.cacheManager; if (!cache) { throw new Error( 'Cannot use Cacheable() decorator without injecting the cache manager.', ); } // Try to get cached data try { const cachedResult = await cache.get(cacheKey); if (cachedResult) { return cachedResult; } } catch (error) { console.error(`Cache get error for key: ${cacheKey}:`, error); } // Call the original method if cache miss const result = await originalMethod.apply(this, args); // Set the new result in cache try { await cache.set(cacheKey, result); } catch (error) { console.error(`Cache set error for key: ${cacheKey}:`, error); } return result; }; return descriptor; }; }
サービス内のメソッドに @Cacheable デコレーターを適用する方法は次のとおりです。
import { Injectable } from '@nestjs/common'; import { Cacheable } from './cacheable.decorator'; const SETTING_CACHE_KEY = 'settings'; @Injectable() export class SettingsService { // Inject the cache manager constructor(private readonly cacheManager: Cache) {} /** * Retrieves settings from the cache if available, or loads them from the * repository and caches the result. * * @returns A promise that resolves to a `Settings` object. */ @Cacheable(SETTING_CACHE_KEY) async getSettings(): Promise<Settings> { return await this.findAll(); } // ... other methods like findAll() and buildTree() }
アプリケーションでキャッシュ マネージャーを使用するには、モジュールにキャッシュ マネージャーを登録する必要があります。
import { Module } from '@nestjs/common'; import { CacheModule } from '@nestjs/cache-manager'; import { SettingsService } from './settings.service'; @Module({ imports: [ CacheModule.register({ isGlobal: true, ttl: 300, // Time to live in seconds max: 100, // Maximum number of items in cache }), ], providers: [SettingsService], }) export class AppModule {}
@Cacheable デコレーターを使用するサービスまたはコントローラーにキャッシュ マネージャーを挿入していることを確認してください。
import { Injectable } from '@nestjs/common'; import { Cache } from 'cache-manager'; @Injectable() export class SettingsService { constructor(private readonly cacheManager: Cache) {} // ... your methods }
カスタムの @Cacheable デコレータを作成すると、メソッドをクリーンな状態に保ち、キャッシュに関する問題をデコレータに任せてコア ロジックに集中できます。このアプローチにより、コードの可読性と保守性が向上し、Nest.js アプリケーションがより効率的でスケーラブルになります。
お気軽にコメントやご質問を下記に残してください。コーディングを楽しんでください! ?
以上がカスタム `@Cacheable` デコレータを使用して Nest.js のパフォーマンスを強化するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。