برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.

در این پست قراره یاد بگیریم چطور میتونیم از ردیس داخل نست جی اس استفاده کنیم و اپلیکیشن خودمون سرعت بیشتری ببخشیم.
Installing NestJS and Redis
برای نصب NestJS میتونید از دستور زیر استفاده کنید:
npm i -g @nestjs/cli
nest new using-redis-in-nestjs #You can replace "using-redis-in-nestjs" with a project name of your choice
بعد از نصب پروژه شما به شکل زیر خواهد بود:
قدم بعدی نیازه که یک کش مینیجر (Cache Manager) در پروژه نصب کنیم:
npm install @nestjs/cache-manager cache-manager
بستهی @nestjs/cache-manager
که در ابتدا بخشی از بستهی @nestjs/common
بود، یک بسته است که به شما امکان تعامل با کش را با استفاده از خود NestJS میدهد، به جای اینکه مستقیماً از بستههای کش استفاده کنید. به عبارت دیگر، ما از APIهای یکپارچهی NestJS به جای APIهای بومی استفاده خواهیم کرد که برای ما راحتتر است، بخاطر اینکه اگه در آینده تصمیم بگیریم که کش را تغییر دهیم، نیازی به تغییر چیزی در کد خود نخواهیم داشت.
حالا برای راهاندازی ماژول کش، به فایل "app.module.ts
" بروید، ماژول کش را از @nestjs/cache-manager
وارد کنید و از متد register
بدون پارامتر استفاده کنید:
import { CacheModule } from '@nestjs/cache-manager';
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [CacheModule.register()],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
این registery حالا به ما اجازه میدهد تا از مدیر کش برای ذخیره و بازیابی دادهها در فایل "app.service.ts
" استفاده کنیم. برای استفاده از آن، باید آن را در سازندهی (constructor) فایل "app.service.ts
" وارد کنیم:
import { CACHE_MANAGER } from '@nestjs/cache-manager';
import { Cache } from 'cache-manager'; // ! Don't forget this import
import { Inject, Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
constructor(@Inject(CACHE_MANAGER) private cacheManager: Cache) {}
getHello(): string {
return 'Hello World!';
}
}
از آنجا که ماژول کش مانند هر ماژول دیگری در NestJS است، شما باید آن را در ماژولی که از آن استفاده میکنید وارد کنید یا گزینهی global بودن آن را فعال کنید:
CacheModule.register({isGlobal: true})
حالا به قسمت استفاده میپردازیم. برای شروع، فقط نیاز دارید که با سه متد آشنا شوید:
await this.cacheManager.set('key', 'value'); // ? Set data in the cache
const value = await this.cacheManager.get('key'); // ? Retrieve data from the cache
await this.cacheManager.del('key'); // ? Delete data from the cache
از آنجا که این سه متد به طور کلی به شما اجازه میدهند که تقریباً هر کاری را در مورد کش انجام دهید، بیایید آنها را در عمل ببینیم.
کد کنترلر:
import { Controller, Delete, Get, Post } from '@nestjs/common';
import { Body } from '@nestjs/common/decorators';
import { CreateDataDto } from 'dtos/create-data.dto';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
async getData() {
try {
return await this.appService.getData();
} catch (error) {
console.log(error);
return error;
}
}
@Post()
async postData(@Body() createDataDto: CreateDataDto) {
try {
return await this.appService.postData(createDataDto);
} catch (error) {
console.log(error);
return error;
}
}
@Delete()
async deleteData() {
try {
return await this.appService.deleteData();
} catch (error) {
console.log(error);
return error;
}
}
}
و این کد برای سرویس:
import { CACHE_MANAGER } from '@nestjs/cache-manager';
import { Cache } from 'cache-manager'; // ! Don't forget this import
import { Inject, Injectable } from '@nestjs/common';
import { CreateDataDto } from 'dtos/create-data.dto';
@Injectable()
export class AppService {
constructor(@Inject(CACHE_MANAGER) private cacheManager: Cache) {}
async getData(): Promise {
const value = await this.cacheManager.get('key'); // ? Retrieve data from the cache return value;
} async postData(createDataDto: CreateDataDto) {
const { value } = createDataDto;
await this.cacheManager.set('key', value); // ? Set data in the cache
} async deleteData() {
await this.cacheManager.del('key'); // ? Delete data from the cache
}
}
دیدید که به راحتی ما تونستیم از کش استفاده کنیم ولی اینجا تموم نمیشه!
ردیس (Redis)
استفاده از ذخیرهسازی پیشفرض در حافظهی موقتی (in-memory store) که NestJS استفاده میکند، ممکن است راهحل کاملی نباشد. برای تغییر ذخیرهسازی، باید نحوهی ثبت ماژول کش را تغییر دهیم.
بیایید ابتدا نگاهی به گزینههای مدیر کش NestJS بیندازیم:
export interface CacheManagerOptions {
store?: string | CacheStoreFactory | CacheStore;
ttl?: number;
max?: number;
isCacheableValue?: (value: any) => boolean;
}
ما میبینیم که گزینهها دارای خاصیت "store" هستند. کاری که باید انجام دهیم این است که این خاصیت را با مقداردهی اولیهی Redis خود پر کنیم.
برای این کار ابتدا باید Redis برای مدیر کش را نصب کنیم:
npm i --save cache-manager-redis-store
حالا برای تغییر متد register
، به منظور حفظ پاکیزگی کد، من یک پوشه به نام "configs" ایجاد کردم و فایلی به نام "app-options.constants.ts
" داخل آن قرار دادم و متد register
را در آن نوشتم:
import { CacheModuleAsyncOptions } from "@nestjs/cache-manager";
import { ConfigModule, ConfigService } from "@nestjs/config";
import { redisStore } from "cache-manager-redis-store";
export const RedisOptions: CacheModuleAsyncOptions = {
isGlobal: true,
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => {
const store = await redisStore({
socket: {
host: configService.get('REDIS_HOST'),
port: parseInt(configService.get('REDIS_PORT')!),
},
});
return {
store: () => store,
};
},
inject: [ConfigService],
};
و به سادگی از آن در ماژول app استفاده کردم:
import { CacheModule } from '@nestjs/cache-manager';
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { RedisOptions } from 'configs/app-options.constants';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
CacheModule.registerAsync(RedisOptions),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁