Predmemoriranje može biti trn u oku svakom programeru. Proveo sam previše sati boreći se sa sporim API-jima i preopterećenim bazama podataka, tražeći rješenje koje je učinkovito i jednostavno za implementaciju.
Zato sam bio oduševljen kada je Karol ( karol71927 ), talentirani član naše organizacije otvorenog koda, Nestixis , stvorio @nestixis/cache-manager.
Ova lagana biblioteka koju pokreće Redis poboljšala je predmemoriranje u mojim NestJS projektima i jedva čekam podijeliti kako je to promijenilo.
Izazov: Složenost predmemoriranja u NestJS-u
Scenarij je previše poznat: vaša aplikacija radi glatko sve dok promet ne poraste, a vaša baza podataka odjednom poklekne pod opterećenjem. Predmemoriranje je očito rješenje—pohranite podatke jednom, poslužite ih brzo—ali integracija u NestJS često se čini glomaznom. Redis nudi snažne mogućnosti, ali njegovo postavljanje obično uključuje svađu konfiguracija, upravljanje pravilima isteka i definiranje prilagođenih ključeva predmemorije.
Trebao mi je alat koji pojednostavljuje proces, a istovremeno omogućuje preciznu kontrolu nad onim što se sprema u predmemoriju, poput parametara zahtjeva ili upita.
Dakle, Karol je dizajnirao @nestixis/cache-manager za rješavanje ovih bolnih točaka čistim, učinkovitim pristupom. Ovaj paket pruža jednostavan API za upravljanje Redis predmemoriranjem, zajedno s podesivim TTL-ovima i podrškom za napredne strategije predmemoriranja. Dostupan je na GitHub repou , a njegov dizajn odražava predanost našeg tima praktičnim alatima za višekratnu upotrebu.
Početak rada: Besprijekorno postavljanje
Instalacija je najjednostavnija:
npm i @nestixis/cache-manager
Da biste ga integrirali u svoju NestJS aplikaciju, registrirajte ga u modulu:
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') || 'localhost', port: +configService.get('REDIS_PORT') || 6379, }, cachePrefix: 'cache:', defaultCacheTTL: 1000, // 1-second default }), inject: [ConfigService], }), ], }) export class AppModule {}
Ovo postavlja Redis predmemoriranje u vašoj aplikaciji uz minimalan napor. Od tamo možete ručno komunicirati s njim u usluzi:
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 = await this.cacheManager.get(key); if (cached) return cached; const data = await this.fetchData(); await this.cacheManager.add(key, data, 1000); // Cache for 1 second return data; } async clearData(key: string) { await this.cacheManager.remove(key); } private fetchData() { return new Promise((resolve) => setTimeout(() => resolve('Data'), 2000)); } }
Ono što izdvaja ovaj paket je njegova sposobnost predmemoriranja na temelju specifičnih pojedinosti zahtjeva—značajka koju je Karol promišljeno uključio. Uzmi ovo
kontroler:
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({ prefix: 'site', ttl: 10000, // 10 seconds by: [ { by: 'param', name: 'token', }, ], }) export class SiteController { constructor(private readonly service: MyService) {} @Get() @UseInterceptors(CacheInterceptor) async get(@Param('token') token: string) { return this.service.getData(`site:${token}`); } // Will clear cache on add or remove of resource to keep fresh state @Post() @UseInterceptors(CacheRemoveInterceptor) async add(@Param('token') token: string) { await this.service.getData(`site:${token}`); // Refresh data } @Delete() @UseInterceptors(CacheRemoveInterceptor) async remove(@Param('token') token: string) { await this.service.clearData(`site:${token}`); } }
@CacheTrackBy
dekorater je ovdje ključ. Osigurava da je predmemoriranje povezano s parametrom :token, tako da /site/abc i /site/xyz svaki dobivaju vlastiti unos u predmemoriju.
Možete ga prilagoditi da umjesto toga koristi upite ili druge kriterije, nudeći fleksibilnost koju sam oduvijek želio. CacheInterceptor obrađuje GET zahtjeve, dok CacheRemoveInterceptor briše predmemoriju ažuriranja—elegantno i intuitivno.