Skip to content

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.

docker-compose.yml
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.

alt text

Silahkan copy paste redis.config dari link berikut ke dalam config/redis.config.

alt text

Kemudian tambahkan perintah berikut agar redis kita memiliki authentikasi dengan password rahasia

config/redis.config
   requirepass password
   user default on +@connection +@all ~* allchannels  >rahasia

alt text

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.

config/redis.config
bind 127.0.0.1 -::1
bind 0.0.0.0

alt text

Untuk membuat container, kita hanya perlu menjalankan perintah docker-compose up -d.

docker command
docker-compose up -d

Setelah selesai kita pastikan container sudah dibuat dengan menjalankan perintah docker ps

docker command
docker ps

alt text

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.

terminal
docker exec -it redis /bin/sh
redis-cli -h localhost
auth rahasia
set tes ihsan
get tes

alt text

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.

alt text

alt text

alt text

Instalasi Package di NestJs

Setelah selesai Instalasi Redis, kemudian kita instalasi package yang dibutuhkan.

terminal
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 package cache-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

env
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD = rahasia

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.

config/cache.config.ts
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.

terminal
npx nest g module redis
npx nest g service redis

alt text

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.

redis.module.ts
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.

redis.service.ts
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}`);
  }
}