Konfigurasi Redis
Instalasi Redis
Pada implementasi kali ini, kita akan instalasi redis di docker seperti materi kafka sebelumnya. Langkah pertama kita ubah file docker-compose.yml
dengan menambahkan perintah berikut.
version: '3.8'd
services:
...
redis:
image : redis:latest
container_name: redis
command : redis-server /usr/local/etc/redis/redis.conf
restart: always
volumes:
- ./config/redis.conf:/usr/local/etc/redis/redis.conf
ports:
- 6379:6379
networks:
arc_network:
external: true
Buatlah file redis.config
dalam folder config
seperti gambar berikut.
Silahkan copy paste
redis.config dari link berikut ke dalam config/redis.config.
Kemudian tambahkan perintah berikut agar redis kita memiliki authentikasi dengan password rahasia
Setelah itu kita tambahkan bind 0.0.0.0
agar redis dapat diakses dari semua IP. Tentu saja ini hanya dilakukan saat development
, adapun pada production
harus lebih selektif lagi.
Untuk membuat container, kita hanya perlu menjalankan perintah docker-compose up -d
.
Setelah selesai kita pastikan container sudah dibuat dengan menjalankan perintah docker ps
Bagaimana mengakses redis
Redis dapat diakses dengan beberapa cara baik dengan CLI ataupun dengan aplikasi seperti table plus.
Command Line Interface
Redis menyediakan Redis CLI (redis-cli
), yang merupakan command line interface
bawaan di redis. Dengan Redis CLI, Kita dapat menjalankan perintah Redis, melakukan operasi CRUD, dan memantau server Redis.
Table Plus
TablePlus adalah GUI yang mendukung berbagai database, termasuk Redis, yang memudahkan kita untuk berinteraksi dengan Redis tanpa harus menggunakan CLI. Dengan TablePlus, kita dapat melihat, menambah, mengedit, dan menghapus data dalam Redis melalui interface visual.
Instalasi Package di NestJs
Setelah selesai Instalasi Redis, kemudian kita instalasi package yang dibutuhkan.
npm install ioredis cache-manager cache-manager-redis-store
npm install @nestjs/cache-manager @types/cache-manager-redis-store
Penjelasan
-
ioredis
merupakan package yang digunakan untuk interaksi Redis dengan aplikasi Node.js, termasuk untuk melakukan operasi read/write, mengelola cache, dan menangani Redis Cluster. -
cache-manager
merupakan untuk mengatur dan mengelola cache dengan dukungan berbagai back-end caching seperti Redis, in-memory, atau store lainnya. -
cache-manager-redis-store
merupakan store redis untuk packagecache-manager
. Dengan menggunakan package ini, cache-manager dapat menggunakan Redis sebagai backend caching.
Membuat environment variabel
untuk redis
Kita tambahkan konfigurasi pada env
untuk redis seperti berikut
Membuat Cache Store
Cache store
pada Redis di NestJS merupakan mekanisme penyimpanan data sementara menggunakan Redis sebagai media caching. Pada aplikasi NestJS, caching berguna untuk menyimpan hasil dari operasi yang memakan waktu atau sering diulang, seperti query database atau API eksternal, sehingga meningkatkan performa dan mengurangi beban pada server.
Dengan menggunakan Redis sebagai cache store, data disimpan dalam memori untuk waktu yang singkat (sesuai TTL atau Time to Live) dan dapat diakses dengan cepat.
Untuk mengkonfigurasi Redis sebagai cache store
di NestJS, kita dapat menggunakan cache-manager-redis-store
dan mengintegrasikan Redis sebagai penyimpanan cache.
Langkah pertama kita buat cache config
seperi berikut.
import { CacheModuleOptions } from '@nestjs/cache-manager';
import * as redisStore from 'cache-manager-redis-store';
export const config: CacheModuleOptions = {
store: redisStore,
host: `${process.env.REDIS_HOST}`,
port: Number(process.env.REDIS_PORT),
auth_pass: `${process.env.REDIS_PASSWORD}`,
}
Membuat Module dan Service redis
Setelah membuat cache config
kita akan membuat module
dan service
redis yang akan digunakan oleh module lain pada aplikasi nestjs.
Registrasi Redis CacheModule
Redis dapat di integrasikan sebagai cache store menggunakan CacheModule. Pada materi ini, kita akan mempelajari bagaimana regisrasi dan mengonfigurasi Redis sebagai mekanisme cache secara global di aplikasi NestJS melalui modul khusus.
import { Global, Module } from '@nestjs/common';
import { RedisService } from './redis.service';
import { CacheModule } from '@nestjs/cache-manager';
@Global()
@Module({
imports : [CacheModule.registerAsync({
isGlobal: true,
useFactory: async () => {
const { config } = await import("../config/cache.config");
return config;
},
})],
providers: [RedisService],
exports:[RedisService]
})
export class RedisModule {}
Method yang dimilki cache-manager
cache-manager
memiliki beberapa method yang bisa kita gunakan untuk implementasi redis sebagai caching. Berikut method-method yang dimiliki cache-manager
.
Feature | Interface | Parameter |
---|---|---|
set |
set(key: string, value: any, options?: CacheOptions) |
- key : Kunci cache (string). |
- value : Nilai yang akan disimpan. |
||
- options : Opsi tambahan, seperti ttl (time-to-live, waktu kadaluarsa). |
||
get |
get(key: string) |
- key : Kunci cache (string). Mengambil nilai dari cache berdasarkan kunci. |
del |
del(key: string) |
- key : Kunci cache (string). Menghapus entri cache berdasarkan kunci. |
reset |
reset() |
Menghapus semua entri dalam cache. |
wrap |
wrap(key: string, fn: Function, ttl?: number) |
- key : Kunci cache (string). |
- fn : Fungsi untuk menghitung atau mengambil nilai baru jika nilai cache tidak ditemukan. |
||
- ttl : (Opsional) Time-to-live untuk nilai cache yang disimpan. |
Membuat Method di Redis Service
Setelah kita tahu apa saja method yang dimiliki cache-manager
. Selanjutnya kita akan membuat method-method yang akan digunakan oleh module lain untuk menyimpan, mengambil, dan menghapus cache di Redis.
import { CACHE_MANAGER } from '@nestjs/cache-manager';
import { Inject, Injectable } from '@nestjs/common';
import { Cache } from 'cache-manager';
@Injectable()
export class RedisService {
@Inject(CACHE_MANAGER) private cacheManager: Cache;
async setCacheKey({
key: key,
data: data,
ttl = 60,
}: {
key: string | number;
data: any;
ttl?: number;
}) {
return await this.cacheManager.set(`${key}`, data, ttl);
}
async getCacheKey(key: string) {
return await this.cacheManager.get(`${key}`);
}
async deleteCacheKey(key: string) {
return await this.cacheManager.del(`${key}`);
}
}