583 чтения
583 чтения

Как освоить распределенный кэш в Nest.JS

к Kamil Fronczak4m2025/04/03
Read on Terminal Reader

Слишком долго; Читать

@nestixis/cache-manager — это легкая библиотека на базе Redis для NestJS. Она предоставляет простой API для управления кэшированием Redis, дополненный настраиваемыми TTL и поддержкой расширенных стратегий кэширования.
featured image - Как освоить распределенный кэш в Nest.JS
Kamil Fronczak HackerNoon profile picture
0-item
Я потратил слишком много часов на борьбу с медленными API и перегруженными базами данных, ищу решения, которое является эффективным и простым в реализации.



Именно поэтому я был в восторге, когда Карол (karol71927), талантливый член нашей организации с открытым исходным кодом, Nestixis, создал @nestixis/cache-manager.


karol71927Нестиксис


Эта легкая библиотека, работающая на 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 очищает кэш на обновлениях — элегантно и интуитивно.

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks