In this article, we are going to do a small demo on the integration of Azure Redis Cache into the NestJS application.
Let's understand the flow of Redis cache in a web application:
(4)The 'Tags', name/value pairs is an optional section.
(5)Finally, select 'Review+ Create', on successful validation, select 'create', on success in a few minutes our Redis instance will be ready.
(4) Now under 'Settings' select 'Access Keys', then copy the connection string either primary or secondary connection string.
In the connection string, we have to identify like 'Host Name', 'Port Number', 'Password'.
Redis Cache:
Redis is an open-source in-memory data structure store, used as a database, cache. It supports data structures such as strings, hashes, lists, sets, stored sets with range queries, etc.
- Users request a page from the web application.
- Web application queries the Redis store, if the data exists, then fetches the data and returns the response directly to the user.
- If no data is in the Redis store, the application queries the database and fetches the data, next save the same data into the Redis store so that subsequent user request can consume the data from the Redis store directly, finally returns the response to the users.
Create A Azure Redis Cache:
Step:1
Create and sign-in into the Azure portal(https://portal.azure.com/)
Step:2
On the Azure portal home page click on 'Create a resource'.
Step:3On the 'Create a resource' page select the 'Databases' and then select 'Azure Cache for Redis'.
Step4:(1)On the 'New Redis Cache' page, enter the project details.
- Subscription- Choose your subscription plan from the dropdown.
- Resource group - Either create a new resource group or select an existing group from the drop-down.
- DNS name- Enter the name of your Redis instance subdomain name.
- Location- Choose your server location from the dropdown.
- Cache type- Select pricing plans for Redis usage. no free plans on it.
(4)The 'Tags', name/value pairs is an optional section.
(5)Finally, select 'Review+ Create', on successful validation, select 'create', on success in a few minutes our Redis instance will be ready.
Create A NestJS Sample Application:
Let's create a sample NestJS application to accomplish our demo.
Command To Install NestJS CLI
npm i -g @nestjs/cli
npm i -g @nestjs/cli
Command To Create NestJS App
nest new your_project_name
nest new your_project_name
Install Cache Npm Packages:
NestJS Cache NPM Packages:
npm install cache-manager
npm install -D @types/cache-manager
npm install cache-manager-redis-store --save
npm install cache-manager
npm install -D @types/cache-manager
npm install cache-manager-redis-store --save
Azure Redis ConnectionString:
(1)On the Azure portal home page click on 'Resource groups'.
(2) On the 'Resource groups' page, select the resource group that has our Azure cache for Redis.(3) Now click 'Azure Cache for Redis' instance.(4) Now under 'Settings' select 'Access Keys', then copy the connection string either primary or secondary connection string.
In the connection string, we have to identify like 'Host Name', 'Port Number', 'Password'.
Redis Store Configuration:
Now let's register the CacheModule with the Redis Store configuration in AppModule.
src/app.module.ts:
import { Module, CacheModule } from '@nestjs/common'; import * as redisStore from 'cache-manager-redis-store'; // existing code hidden for display purpose @Module({ imports: [CacheModule.register({ store: redisStore, port:6380, auth_pass:"your_azure_redis_password", host:"your_azure_redis_host_name", tls:{ host:"your_azure_redis_host_name" }, })] }) export class AppModule {}
- (Line: 1) The 'CacheModule' loads from the '@nestjs/common'.
- (Line: 2) Importing the 'cache-manager-redis-store' library.
- (Line: 7-16) Registered the 'CahceModule' with Redis configurations. The 'store' define type of cache, 'port' is our Azure Redis cache running port number, 'auth_pass' is our Azure Redis cache password, 'host' is our Azure Redis hostname, 'tls' means Transport Layer Security that is by default enabled by the Azure Redis cache so it is mandatory to define the 'tls' configuration and inside of it we have to specify our Redis hostname again.
Inject CacheManager:
Now in our controllers to communicate with the Azure Redis store we need to inject the CacheManager.
src/app.controller.ts:
import { Controller, Get, CACHE_MANAGER, Inject, CacheTTL } from '@nestjs/common'; import { Cache } from 'cache-manager'; @Controller() export class AppController { constructor(@Inject(CACHE_MANAGER) private cacheManager: Cache) {} }
- The 'Cache' type is generic and works with any cache-store and provides default methods for cache communication. The 'CACHE_MANAGER' is a lookup for the provider to be injected which means it will inject the cache-store that is registered by the CacheModule, in our sample, it will inject Redis cache-store.
Create A Sample Response Model:
Now let's create a sample API response model like 'car.ts'.
src/car.ts:
export interface Car { id: number; manufacturer: string; model: string; year: number; }Now in 'app.controller.ts' for demo purposes let's add a variable that contains mock data or test data of type 'Car'. In a real application, data need to be fetched from the database, for demo purposes just storing in a variable.
src/app.controller.ts:
// existing code hidden for display purpose export class AppController { fakeDatabase: Car[] = [ { id: 1, manufacturer: 'Honda', model: 'Civic', year: 2021, }, { id: 2, manufacturer: 'Hundyi', model: 'Venue', year: 2022, }, ]; }
Get And Set Methods:
The 'Set' method is to store our data in the Redis Store. The 'Get' method to fetch data from the Redis store.
Let's store a sample string and fetch it from the Redis store by creating a sample endpoint.
src/app.controller.ts:
@Get() async getCars() { var carsFromRedis = await this.cacheManager.get<Car[]>('cars-store'); if (carsFromRedis && carsFromRedis.length > 0) { return { loadedFromRedis: true, data: carsFromRedis }; } await this.cacheManager.set<Car[]>("cars-store", this.fakeDatabase) return { loadedFromRedis: false, data: this.fakeDatabase }; }
- (Line: 3) Using 'get<Car[]>()' method of cache manager trying to fetch data from the Redis store.
- (Line: 5-7) If Redis store returns the property data then we will return it as a response to our endpoint. Here for understanding, I have added property like 'loadedFromRedis' to the response(don't add a property like this for real applications).
- (Line: 9) If the Redis store doesn't have data then this gets executed. Here using the 'set<Car[]>()' method we are saving the data to the Redis store with an appropriate key.
Cache Expiration:
It is always recommended to specify the expiration value for the cache. So we have to approach to define cache values like 'Global Level', 'Endpoint Level'.
Defining Global level expiration sets the same expiration value for all the data that we stored in the Redis store.
src/app.module.ts:
CacheModule.register({ store: redisStore, port:6380, auth_pass:"your_azure_redis_password", host:"your_azure_redis_host", tls:{ host:"your_azure_redis_host" }, ttl: 300 // define time in seconds }
- Here the 'ttl' property contains time seconds for expiration. So here I define expiration like all Redis cache store data will be expired after 300 seconds.
src/app.controller.cs:
@Get() @CacheTTL(50) async getCars() { var carsFromRedis = await this.cacheManager.get<Car[]>('cars-store'); if (carsFromRedis && carsFromRedis.length > 0) { return { loadedFromRedis: true, data: carsFromRedis }; } await this.cacheManager.set<Car[]>("cars-store", this.fakeDatabase) return { loadedFromRedis: false, data: this.fakeDatabase }; }
- (Line: 2) Used endpoint level expiration on a method by decorating with '@CacheTTL()'
Del And Reset Methods:
The cache store provides the method 'del('key')' used to delete the record from the cache.
await this.cacheManager.del('your_key_to_delte');The cache store provides the method 'reset()' used to clear the entire Redis store cache.
await this.cacheManager.reset()
Support Me!
Buy Me A Coffee
PayPal Me
Video Session:
Wrapping Up:
Hopefully, I think this article delivered some useful information on Use Azure Cache For Redis in the NestJS application. using I love to have your feedback, suggestions, and better techniques in the comment section below.
This is amazing, thanks
ReplyDelete