«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Повысьте производительность Nest.js с помощью специального декоратора @Cacheable.

Повысьте производительность Nest.js с помощью специального декоратора @Cacheable.

Опубликовано 1 ноября 2024 г.
Просматривать:908

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