کاوش در حافظه پنهان با NestJS و Redis

در این آموزش، دنیای کش را با NestJS و Redis بررسی خواهیم کرد.
قبل از اینکه وارد Redis شویم، NestJS آن را ارائه می کند کش درون حافظه، که می تواند به عنوان یک ذخیره اطلاعات در حافظه عمل کند، اما به راحتی می تواند به سیستم کش با عملکرد بالا مانند Redis تغییر یابد.
برای شروع، می توانید این مخزن github را فورک کنید. لطفاً مطمئن شوید که شاخه پایه را انتخاب کرده اید زیرا حاوی تنظیمات برنامه پایه برای این آموزش است.
پس از راهاندازی راهاندازی برنامه پایه، میتوانید به نصب آن ادامه دهید cache-manager
بسته و وابستگی های آن
npm install @nestjs/cache-manager cache-manager
در صورتی که با اجرای حافظه پنهان NestJS آشنا هستید، یک به روز رسانی فعلی برای مدیریت کش وجود دارد، ما در سراسر این آموزش از نسخه 5 استفاده می کنیم. بر خلاف نسخه 4، نسخه 5 اکنون ارائه می دهد ttl (Time-To-Live) در میلی ثانیه بجای. ما باید قبل از تجزیه آن به NestJS تبدیل را انجام دهیم زیرا NestJs این تبدیل را برای ما انجام نمی دهد.
برای فعال کردن کش، باید آن را وارد کنیم CacheModule
به درون app.module.ts
فایل.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { MongooseModule } from '@nestjs/mongoose';
import { ContactModule } from './contact/contact.module';
import { CacheModule } from '@nestjs/cache-manager';
@Module({
imports: [
// mongodb://127.0.0.1:27017/nest-redis - use env variables or other secure options in production
MongooseModule.forRoot('mongodb://127.0.0.1:27017/nest-redis', {
useNewUrlParser: true,
}), ContactModule,
CacheModule.register(),
], controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
ما app.module.ts
فایل باید شبیه تصویر بالا باشد.
ما همچنین قصد داریم آن را به ما وارد کنیم Contact
مدول. با هر ماژول ویژگی در NestJS، نیاز به وارد کردن وجود دارد cache-manager
به ترتیب در آنها. اگر ماژولی دارید که نیازی به ذخیره سازی ندارد، این یک ضرورت نیست.
ما contact.module.ts
باید شبیه بلوک کد زیر باشد:
import { Module } from '@nestjs/common';
import { ContactService } from './contact.service';
import { ContactController } from './contact.controller';
import { MongooseModule } from '@nestjs/mongoose';
import { ContactSchema } from './schemas/schema';
import { CacheModule } from '@nestjs/cache-manager';
@Module({
imports: [
MongooseModule.forFeature([{ name: 'Contact', schema: ContactSchema }]),
CacheModule.register(),
], providers: [ContactService],
controllers: [ContactController],
})
export class ContactModule {}
یک جایگزین خوب، تنظیم است isGlobal
گزینه برای CacheModule.register(). اگر به در دسترس بودن کش در تمام ماژول های خود نیاز دارید، می توان این گزینه را در نظر گرفت.
بیایید به سمت خود ادامه دهیم Contact controller
برای اصلاح برخی از نقاط پایانی موجود. برای @Get('contacts/:contactId')
نقطه پایانی، ما می خواهیم بررسی کنیم که آیا ما response
قبل از فراخوانی متد، در حافظه پنهان است. این امر با استفاده از @useInterceptors
دکوراتور:
ما getContact
روش باید مشابه روش زیر باشد:
@UseInterceptors(CacheInterceptor) // Automatically cache the response for this endpoint
@Get('contacts/:contactId')
async getContact(
@Res() res,
@Param('contactId') contactId,
) {
const contact = await this.contactService.getContact(contactId);
if (!contact) throw new NotFoundException('Contact does not exist');
return res.status(HttpStatus.OK).json(contact);
}
موارد قابل توجه:
- زمان انقضا 5 ثانیه است
- رهگیر بر اساس مسیر مسیر، کلید حافظه پنهان را برای ورودی حافظه پنهان تولید می کند. هر دو گزینه را می توان به طور موثر کنترل و لغو کرد.
اجرای یک لغو، ما getContact
خواهد بود:
@UseInterceptors(CacheInterceptor) // Automatically cache the response for this endpoint
@CacheKey('getcontact-key')
@CacheTTL(60000) // now in milliseconds (1 minute === 60000)
@Get('contacts/:contactId')
async getContact(
@Res() res,
@Param('contactId') contactId,
) {
const contact = await this.contactService.getContact(contactId);
if (!contact) throw new NotFoundException('Contact does not exist');
return res.status(HttpStatus.OK).json(contact);
}
- طبق اسناد رسمی Nestjs، CacheModule به درستی با برنامههای GraphQL کار نمیکند*
حالا ردیس
طبق وبسایت رسمی Redis، «Redis یک ذخیرهسازی ساختار داده منبع باز و درون حافظه است که به عنوان پایگاه داده، حافظه پنهان، واسطه پیام و موتور جریان استفاده میشود.»
نظرسنجی از Redis
برای استفاده از Redis به جای کش در حافظه، باید بسته مربوطه را نصب کنیم:
npm i --save cache-manager-redis-yet
این بسته یک nestjs
بسته بندی برای انتقال تنظیمات به node_redis
بسته بندی اکنون می توانیم برخی از تنظیمات خود را تغییر دهیم app.module.ts
برای استفاده از Redis
توجه داشته باشید: cache-manager-redis-store
برای اجازه دادن به بسته ای که به تازگی نصب کرده ایم، متوقف شده است. این package
ما نصب کردیم مستقیماً توسط Nestjs
تیم
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { MongooseModule } from '@nestjs/mongoose';
import { ContactModule } from './contact/contact.module';
import { CacheModule } from '@nestjs/cache-manager';
import { redisStore } from 'cache-manager-redis-yet';
@Module({
imports: [
MongooseModule.forRoot('mongodb://127.0.0.1:27017/nest-redis', {
useNewUrlParser: true,
}),
CacheModule.registerAsync({
isGlobal: true,
useFactory: async () => ({
store: await redisStore({
socket: {
host: 'localhost',
port: 6379,
},
}),
}),
}),
ContactModule,
], controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
این به ما امکان اضافه کردن موارد جدید را داده است config options
پسندیدن:
redisStore: نشان دهنده node-cache-manager-redis-yet
ما تازه نصب کردیم
هاست و پورت روی پیش فرض خود تنظیم شده اند
در صورتی که هنوز سرور Redis را در حال اجرا ندارید، می توانید روش های نصب مختلف سیستم عامل خود را جستجو کنید یا گزینه Docker را در نظر بگیرید.
به سمت ما contact.controller
صفحه، ما می توانیم صفحه خود را پیکربندی کنیم getContact
روش، برای بررسی اینکه آیا قبل از پرس و جو از پایگاه داده اصلی هنوز یک داده ذخیره شده در حافظه پنهان داریم یا خیر. اگر وجود دارد، میخواهیم آن را پس از پرسوجو از DB تنظیم کنیم.
ما getContact
باید شبیه این باشد:
@Get('contacts/:contactId')
async getContact(@Res() res, @Param('contactId') contactId) {
const cachedData = await this.cacheService.get(contactId.toString());
if (cachedData) {
console.log('Getting data from cache');
return res.status(HttpStatus.OK).json(cachedData);
}
const contact = await this.contactService.getContact(contactId);
if (!contact) throw new NotFoundException('Contact does not exist');
await this.cacheService.set(contactId.toString(), contact);
const newCachedData = await this.cacheService.get(contactId.toString());
console.log('data set to cache', newCachedData);
return res.status(HttpStatus.OK).json(contact);
}
بیایید نگاهی کوتاه به بلوک کد بالا بیندازیم:
const cachedData = await this.cacheService.get(contactId.toString());
if (cachedData) {
console.log('Getting data from cache');
return res.status(HttpStatus.OK).json(cachedData);
}
را cachedData
متغیر در حال بررسی است که آیا ما یک کش موجود داریم، اگر وجود دارد، می توانید لاگر خود را بررسی کنید و دریافت خواهید کرد دریافت داده از کش.
await this.cacheService.set(contactId.toString(), contact);
const newCachedData = await this.cacheService.get(contactId.toString());
console.log('data set to cache', newCachedData);
اگر دادههای ما در حافظه پنهان وجود نداشته باشد، بلوک کد بالا به ما کمک میکند تا در کش تنظیم کنیم.
داده های کش شما اکنون در سرور محلی Redis شما باقی می ماند.
شما می توانید نقطه پایانی را آزمایش کنید و باید نتیجه ای مشابه خروجی من در لاگر دریافت کنید:
[Nest] 3720 - 05/09/2023, 10:00:49 AM LOG [NestApplication] Nest application successfully started +5ms
data set to cache {
_id: '6459510cfc398baa01998a66',
first_name: 'Daniel',
last_name: 'Olabemiwo',
email: 'dee@gmail.com',
phone: '+23832101',
message: 'Welcome to this side',
__v: 0
}
میتوانید در رابط کاربری گرافیکی انتخابی خود (من TablePlus را دوست دارم) با ارسال درخواستی به برنامه NestJS خود که در آن از حافظه پنهان استفاده میشود، تأیید کنید و خواهید دید که دادهها اکنون ادامه دارند:
تبریک میگوییم، شما به تازگی یک کش Redis را به برنامه NestJS خود اضافه کردهاید.
در این آموزش، ما با موفقیت یک کش Redis را به برنامه Nestjs خود اضافه کردیم.
Redis تأخیر کمتر برنامه و دسترسی به داده های بسیار بالا را فعال می کند. این به مهندسان نرم افزار اجازه می دهد تا راه حل هایی با کارایی بالا و قابل اعتماد بسازند.
و بس! شما چی فکر میکنید؟ با گذاشتن کامنت در ادامه به من اطلاع دهید.