برنامه نویسی

کاوش در حافظه پنهان با 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 در TablePlus

تبریک می‌گوییم، شما به تازگی یک کش Redis را به برنامه NestJS خود اضافه کرده‌اید.

در این آموزش، ما با موفقیت یک کش Redis را به برنامه Nestjs خود اضافه کردیم.
Redis تأخیر کمتر برنامه و دسترسی به داده های بسیار بالا را فعال می کند. این به مهندسان نرم افزار اجازه می دهد تا راه حل هایی با کارایی بالا و قابل اعتماد بسازند.

و بس! شما چی فکر میکنید؟ با گذاشتن کامنت در ادامه به من اطلاع دهید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا