ඕනෑම සංවර්ධකයෙකුට හැඹිලිගත කිරීම උලක් විය හැකිය. මන්දගාමී API සහ අධික බර සහිත දත්ත සමුදායන් සමඟ පොරබදමින්, ඵලදායී හා ක්රියාත්මක කිරීමට පහසු විසඳුමක් සොයමින් මම පැය ගණනාවක් ගත කර ඇත්තෙමි.
ඒ නිසා තමයි අපේ විවෘත මූලාශ්ර සංවිධානයක් වන Nestixis හි දක්ෂ සාමාජිකයෙකු වන Karol ( karol71927 ) @nestixis/cache-manager නිර්මාණය කළ විට මම සතුටට පත් වුණේ.
මෙම සැහැල්ලු, Redis-බලයෙන් ක්රියාත්මක වන පුස්තකාලය මගේ NestJS ව්යාපෘතිවල හැඹිලිගත කිරීම විධිමත් කර ඇති අතර, එය වෙනසක් ඇති කළ ආකාරය බෙදා ගැනීමට මම උනන්දු වෙමි.
අභියෝගය: NestJS හි හැඹිලිගත කිරීමේ සංකීර්ණතාව
මෙම අවස්ථාව ඉතා හුරුපුරුදුය: ඔබේ යෙදුම තදබදය වැඩි වන තෙක් සුමටව ක්රියාත්මක වන අතර හදිසියේම ඔබේ දත්ත සමුදාය බරින් අඩු වේ. හැඹිලිගත කිරීම පැහැදිලි විසඳුමක් වේ - දත්ත එක් වරක් ගබඩා කර ඉක්මනින් සේවය කරන්න - නමුත් එය NestJS වෙත ඒකාබද්ධ කිරීම බොහෝ විට අපහසු බවක් දැනේ. Redis බලවත් හැකියාවන් ලබා දෙයි, නමුත් එය සැකසීමට සාමාන්යයෙන් වින්යාසයන් සමඟ පොරබදමින්, කල් ඉකුත් වීමේ ප්රතිපත්ති කළමනාකරණය කර අභිරුචි හැඹිලි යතුරු නිර්වචනය කිරීම ඇතුළත් වේ.
ඉල්ලීම් පරාමිතීන් හෝ විමසුම් වැනි හැඹිලිගත වන දේ කෙරෙහි නිශ්චිත පාලනයක් ලබා දෙන අතරම ක්රියාවලිය සරල කරන මෙවලමක් මට අවශ්ය විය.
ඉතින්, කැරොල් විසින් මෙම ගැටළු නිරාකරණය කිරීම සඳහා @nestixis/cache-manager නිර්මාණය කරන ලද්දේ පිරිසිදු, කාර්යක්ෂම ප්රවේශයකින්. මෙම පැකේජය Redis හැඹිලිගත කිරීම කළමනාකරණය කිරීම සඳහා සරල API එකක් සපයන අතර, වින්යාසගත කළ හැකි TTL සහ උසස් හැඹිලිගත කිරීමේ උපාය මාර්ග සඳහා සහාය ලබා දෙයි. එය එහි GitHub repo හි ලබා ගත හැකි අතර, එහි සැලසුම ප්රායෝගික, නැවත භාවිතා කළ හැකි මෙවලම් සඳහා අපගේ කණ්ඩායමේ කැපවීම පිළිබිඹු කරයි.
ආරම්භ කිරීම: බාධාවකින් තොරව සැකසීම
ස්ථාපනය හැකි තරම් සරලයි:
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') || 'localhost', port: +configService.get('REDIS_PORT') || 6379, }, cachePrefix: 'cache:', defaultCacheTTL: 1000, // 1-second default }), inject: [ConfigService], }), ], }) export class AppModule {}
මෙය ඔබගේ යෙදුම පුරා අවම උත්සාහයකින් 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 = 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)); } }
මෙම පැකේජය වෙනස් කරන්නේ නිශ්චිත ඉල්ලීම් විස්තර මත පදනම්ව හැඹිලිගත කිරීමේ හැකියාවයි - කැරොල් කල්පනාකාරීව ඇතුළත් කර ඇති විශේෂාංගයකි. මෙය ගන්න
පාලකය:
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
සැරසිලිකරු මෙහි යතුරයි. එය හැඹිලිගත කිරීම :token පරාමිතියට බැඳී ඇති බව සහතික කරයි, එබැවින් /site/abc සහ /site/xyz යන දෙකටම තමන්ගේම හැඹිලි ඇතුළත් කිරීමක් ලැබේ.
ඔබට එය විමසුම් හෝ වෙනත් නිර්ණායක භාවිතා කිරීමට සකස් කළ හැකි අතර, මට සැමවිටම අවශ්ය නම්යශීලී බව ලබා දෙයි. CacheInterceptor GET ඉල්ලීම් හසුරුවන අතර CacheRemoveInterceptor යාවත්කාලීන කිරීම් වල හැඹිලිය හිස් කරයි - අලංකාර සහ අවබෝධාත්මක.