「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > カスタム `@Cacheable` デコレータを使用して Nest.js のパフォーマンスを強化する

カスタム `@Cacheable` デコレータを使用して Nest.js のパフォーマンスを強化する

2024 年 11 月 1 日に公開
ブラウズ:456

Enhance Your Nest.js Performance with a Custom `@Cacheable` Decorator

キャッシュは、アプリケーションのパフォーマンスとスケーラビリティを向上させるための基本的な技術です。 Nest.js では、組み込みのキャッシュ マネージャーを使用してキャッシュをシームレスに統合できます。この記事では、カスタム @Cacheable デコレータを作成して、Nest.js サービスまたはコントローラでのキャッシュを簡素化する方法を説明します。

?カスタム @Cacheable デコレーターを使用する理由

Nest.js はすぐに使用できる強力なキャッシュ メカニズムを提供しますが、メソッド内にキャッシュ ロジックを直接適用するとコードが煩雑になる可能性があります。カスタム デコレーターはこのロジックを抽象化し、コードをよりクリーンで保守しやすくします。

? @Cacheable デコレータの作成

メソッドの結果をキャッシュするために使用する @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 デコレータの使用

@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 {
    return await this.findAll();
  }

  // ... other methods like findAll() and buildTree()
}

?説明

  • デコレータ アプリケーション: @Cacheable デコレータは、特定のキャッシュ キーを使用して getSettings() メソッドに適用されます。
  • 依存関係の挿入: キャッシュ マネージャーは、デコレーターによって使用されるサービスに挿入されます。

? Nest.js へのキャッシュ マネージャーの統合

アプリケーションでキャッシュ マネージャーを使用するには、モジュールにキャッシュ マネージャーを登録する必要があります:

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 {}

?説明

  • グローバル キャッシュ: isGlobal: true を設定すると、アプリケーション全体でキャッシュ マネージャーを利用できるようになります。
  • TTL および最大アイテム数: キャッシュ内の有効期間 (ttl) とアイテムの最大数 (max) を構成します。

?キャッシュマネージャーの挿入

@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 アプリケーションがより効率的かつスケーラブルになります。

以下にお気軽にコメントやご質問を残してください。コーディングを楽しんでください! ?

リリースステートメント この記事は次の場所に転載されています: https://dev.to/marrouchi/enhance-your-nestjs-performance-with-a-custom-cacheable-decorator-589o?1 権利侵害がある場合は、[email protected] までご連絡ください。それを削除するには
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3