É por isso que eu fiquei empolgado quando Karol (karol71927), um membro talentoso da nossa organização de código aberto, Nestixis, criou @nestixis/cache-manager.
karol71927Nestixis
Esta biblioteca leve e alimentada por Redis simplificou o cache em meus projetos NestJS, e estou ansioso para compartilhar como isso fez a diferença.
O Desafio: Caching Complexity em NestJS
O cenário é muito familiar: seu aplicativo é executado suavemente até que o tráfego aumente e, de repente, seu banco de dados cai sob a carga. O cache é a solução óbvia – armazene os dados uma vez, sirva-os rapidamente – mas integrá-lo ao NestJS muitas vezes é complicado.
Eu precisava de uma ferramenta que simplificasse o processo, permitindo controlo preciso sobre o que é cacheado, como parâmetros de solicitação ou consultas.
Então, Karol projetou @nestixis/cache-manager para abordar esses pontos de dor com uma abordagem limpa e eficiente. Este pacote fornece uma API simples para gerenciar o cache do Redis, completa com TTLs configuráveis e suporte para estratégias avançadas de cache. Está disponível em seu repo do GitHub, e seu design reflete o compromisso da nossa equipe com ferramentas práticas e reutilizáveis.
seu repo do GitHubComeçar: Configuração sem fios
A instalação é tão simples quanto fica:
npm i @nestixis/cache-manager
npm i @nestixis/cache-manager
Para integrá-lo ao seu aplicativo NestJS, registre-o em um módulo:
importação { Modulo } de '@nestjs/common'; importação { CacheModule } de '@nestixis/cache-manager'; importação { ConfigModule, ConfigService } de '@nestjs/config'; @Module({ importação: [ CacheModule.registerAsync({ éGlobal: verdadeiro, importações: [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 timportação { Module } de '@nestjs/common'; importação { CacheModule } de '@nestixis/cache-manager'; importação { ConfigModule, ConfigService } de '@nestjs/config'; @Module({ imports: [ CacheModule.registerAsync({ isGlobal: true, imports: [ConfigModule], useFactory: (configService: ConfigService) => ({ redis: { host: configService.get('REDIS_HOST')
Isso configura o cache do Redis em todo o seu aplicativo com um esforço mínimo.A partir daí, você pode interagir com ele manualmente em um serviço:
import { Injectable } de '@nestjs/common'; import { CacheManager } de '@nestixis/cache-manager'; @Injectable() export class MyService { constructor(private readonly cacheManager: CacheManager) {} async getData(key: string) { const cached = wait this.cacheManager.get(key); se (cached) retorno cached; const = data wait this.fetchData(); wait this.cacheMancheager.addkey(key, data, 1000); // Cache para 1 segundo retorno de dados; } async clearData(key: string) { await this.MancheManager.remove(key); } private fetchData() {import { Injectable } a partir de '@nestjs/common'; import { CacheManager } a partir de '@nestixis/cache-manager'; @Injectable() export class MyService { constructor(private readonly cacheManager: CacheManager) {} async getData(key: string) { const cached = wait this.cacheManager.get(key); se (cached) retorno cached; const data = wait this.fetchData(); wait this.cacheManager.add(key, data, 1000); // Cache para 1 segundo retorno de dados; } async clearData(key: string) wait { this.cacheManager.remover.get(key); } private fetchData() ret
O que distingue este pacote é a sua capacidade de cache com base em detalhes de solicitação específicos – um recurso incluído pensativamente por Karol.
Controlador:
import { Controller, Get, Post, Delete, Param, UseInterceptors } de '@nestjs/common'; import { CacheInterceptor, CacheRemoveInterceptor, CacheTrackBy } de '@nestixis/cache-manager'; import { MyService } de './my.service'; @Controller('site/:token) @CacheTrackBy({ prefixo:'site', ttl: 10000, // 10 segundos por: { por: 'param', nome: 'token', }, }, }) export class SiteController {construtor(serviço privado de leitura: MyService) } de './my.serviço'; @Controller('site/:token)import { Controller, Get, Post, Delete, Param, UseInterceptors } de '@nestjs/common'; import { CacheInterceptor, CacheRemoveInterceptor, CacheTrackBy } de '@nestixis/cache-manager'; import { MyService } de './my.service'; @Controller('site/:token) @CacheTrackBy({ prefixo:'site', ttl: 10000, // 10 segundos por: { por: 'param', nome: 'token', }, }, }) export classe SiteController {construtor(serviço privado de leitura: './my.service'); {Get() @UseInterceptors(CacheInterceptor) string @WEB
O decorador @CacheTrackBy
é a chave aqui. Assegura que o cache está ligado ao parâmetro :token, então /site/abc e /site/xyz cada um obtém sua própria entrada de cache.
@CacheTrackBy
Você pode ajustá-lo para usar consultas ou outros critérios em vez disso, oferecendo a flexibilidade que eu sempre quis.O CacheInterceptor lida com solicitações GET, enquanto o CacheRemoveInterceptor limpa o cache em atualizações - elegante e intuitivo.