Эта легкая библиотека, работающая на Redis, упростила кеширование в моих проектах NestJS, и я с нетерпением жду, чтобы поделиться тем, как это изменило ситуацию.
The Challenge: Caching Complexity в NestJS
Сценарий слишком знакомый: ваше приложение работает плавно, пока трафик не увеличится, и внезапно ваша база данных забивается под нагрузкой. Кэширование является очевидным решением — хранить данные один раз, обслуживать их быстро, но интегрировать его в NestJS часто затруднительно. Redis предлагает мощные возможности, но настройка его обычно включает в себя ссоры в конфигурациях, управление политиками истечения срока действия и определение индивидуальных ключей кэша.
Мне нужен инструмент, который упрощает процесс, позволяя при этом точно контролировать то, что в кеш, например, параметры запросов или запросы.
Таким образом, Карол разработал @nestixis/cache-manager для решения этих проблем с помощью чистого, эффективного подхода. Этот пакет обеспечивает простой API для управления кешированием Redis, полный с конфигурируемыми TTL и поддержкой передовых стратегий кеширования. Он доступен по адресу its GitHub repo, и его дизайн отражает приверженность нашей команды практическим, повторным инструментам.
ее GitHub репоЗапуск: Бесшовная настройка
Инсталляция так же проста, как и получается:
npm i @nestixis/cache-manager
npm i @nestixis/cache-manager
Чтобы интегрировать его в свое приложение NestJS, зарегистрируйте его в модуле:
Import { Module } from '@nestjs/common'; import { CacheModule } from '@nestixis/cache-manager'; import { ConfigModule, ConfigService } from '@nestjs/config'; @Module({ imports: [ CacheModule.registerAsync({ isGlobal: true, imports: [ConfigModule], useFactory: (configService: ConfigService) => ({ redis: { host: configService.get('REDIS_HOST')', t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t t tImport { Module } from '@nestjs/common'; import { CacheModule } from '@nestixis/cache-manager'; import { ConfigModule, ConfigService } from '@nestjs/config'; @Module({ imports: [ CacheModule.registerAsync({ isGlobal: true, imports: [ConfigModule], useFactory: (configService: ConfigService) => ({ redis: { host: configService.get('REDIS_HOST')
Это устанавливает кеширование Redis в вашем приложении с минимальными усилиями. Оттуда вы можете взаимодействовать с ним вручную в сервисе:
import { Injectable } from '@nestjs/common'; import { CacheManager } from '@nestixis/cache-manager'; @Injectable() export class MyService { constructor(private readonly cacheManager: CacheManager) {} async getData(key: string) { const cached = wait this.cacheManager.get(key); if (cached) return cached; const = data await this.fetchData(); wait this.cacheMancheager.addkey(key, data, 1000); // Cache for 1 second return data; } async clearData(key: string) { await this.cacheMancheManager.remove(key); } private fetchData() {import { Injectable } from '@nestjs/common'; import { CacheManager } from '@nestixis/cache-manager'; @Injectable() export class MyService { constructor(private readonly cacheManager: CacheManager) {} async getData(key: string) { const cached = wait this.cacheManager.get(key); if (cached) return cached; const data = wait this.fetchData(); wait this.cacheManager.add(key, data, 1000); // Cache for 1 second return data; } async clearData(key: string) wait { this.cacheManager.remager.key); } private fetchData() return { new Promise((resolve)
Что отличает этот пакет, так это его способность к кешированию на основе конкретных деталей запроса — функция Karol тщательно включена.
Контроллер:
import { Controller, Get, Post, Delete, Param, UseInterceptors } from '@nestjs/common'; import { CacheInterceptor, CacheRemoveInterceptor, CacheTrackBy } from '@nestixis/cache-manager'; import { MyService } from './my.service'; @Controller('site/:token) @CacheTrackBy({ префикс:'site', ttl: 10000, // 10 секунд по: {by: 'param', name: 'token', }, }, }) export class SiteController {constructor(private readonly service: MyService) } from './my.service'; {@Controller(site/:token)}import { Controller, Get, Post, Delete, Param, UseInterceptors } from '@nestjs/common'; import { CacheInterceptor, CacheRemoveInterceptor, CacheTrackBy } from '@nestixis/cache-manager'; import { MyService } from './my.service'; @Controller('site/:token') @CacheTrackBy({ префикс:'site', ttl: 10000, // 10 секунд по: { by: 'param', имя: 'token', }, }, }) export class SiteController {constructor(private readonly service: MyService'); {Get() @UseInterceptors(CacheInterceptor) string as you get@P
Декоратор @CacheTrackBy
является ключом здесь. Он гарантирует, что кэширование связано с параметром :token, поэтому /site/abc и /site/xyz каждый получает свой собственный вход в кэш.
@CacheTrackBy
Вы можете настроить его на использование запросов или других критериев вместо этого, предлагая гибкость, которую я всегда хотел. CacheInterceptor обрабатывает запросы GET, в то время как CacheRemoveInterceptor очищает кэш на обновлениях — элегантно и интуитивно.