Recraftory

Redis sebagai Cache

Menggunakan Redis sebagai distributed cache di aplikasi

Mengapa Redis untuk Cache

  • In-memory store dengan performa sangat tinggi
  • Mendukung berbagai struktur data: string, list, hash, set
  • Bisa diakses dari banyak server sekaligus
  • TTL bawaan untuk automatic expiration

Perintah Cache Dasar dengan Redis

SET dengan TTL

  • SET key value EX 3600 menyimpan dengan expire 3600 detik
  • SETEX key 3600 value alternatif untuk set dengan TTL

GET

  • GET key mengambil nilai dari cache
  • Mengembalikan nilai atau nil jika key tidak ada

DEL

  • DEL key menghapus key dari cache
  • Bisa menerima banyak key sekaligus

EXISTS

  • EXISTS key memeriksa apakah key ada
  • Mengembalikan 1 jika ada, 0 jika tidak

TTL

  • TTL key mengecek sisa waktu expire key dalam detik
  • Mengembalikan -1 jika tidak ada expire, -2 jika key tidak ada

Pola Cache dengan Redis

Cache-Aside Pattern

async function getUser(id) {
  const cacheKey = `user:${id}`;
  let user = await redis.get(cacheKey);

  if (user) {
    return JSON.parse(user);
  }

  user = await database.getUser(id);
  await redis.setex(cacheKey, 3600, JSON.stringify(user));

  return user;
}

Cache Invalidation saat Update

async function updateUser(id, data) {
  await database.updateUser(id, data);
  await redis.del(`user:${id}`);
}

Struktur Data Redis untuk Cache

String

  • Paling umum untuk menyimpan JSON serialized
  • Cocok untuk object tunggal

Hash

  • Menyimpan field-value pairs
  • Cocok untuk object dengan banyak atribut
  • Lebih efisien daripada string JSON untuk update parsial

List

  • Menyimpan koleksi terurut
  • Cocok untuk timeline atau recent items

Set

  • Koleksi unik tanpa urutan
  • Cocok untuk tag atau relationship

Sorted Set

  • Koleksi dengan skor untuk pengurutan
  • Cocok untuk leaderboard atau data yang sering diurutkan

Redis Cache di Aplikasi

Session Cache

  • Menyimpan session user di Redis
  • Memungkinkan session persisten meski server restart
  • Cocok untuk aplikasi dengan banyak server

Query Result Cache

  • Menyimpan hasil query database yang kompleks
  • Key bisa berbasis parameter query
  • Hapus saat data underlying berubah

Rate Limiting

  • Menggunakan INCR dan EXPIRE
  • Menghitung request per IP atau user dalam jangka waktu
  • Menolak request yang melebihi batas

Leaderboard dan Ranking

  • Menggunakan sorted set dengan skor
  • Update skor dengan ZADD
  • Ambil ranking dengan ZRANGEBYSCORE

Konfigurasi Redis untuk Cache

maxmemory

  • Batasi memory yang digunakan Redis
  • Saat penuh, Redis menghapus key berdasarkan kebijakan eviction

Eviction Policies

  • allkeys-lru menghapus key yang paling jarang digunakan
  • allkeys-lfu menghapus key dengan frekuensi akses terendah
  • volatile-lru hanya menghapus key dengan TTL

Praktik Terbaik

  • Gunakan namespace di key, contoh app:user:1
  • Serialisasi object ke JSON sebelum disimpan
  • Pantau memory usage dan hit ratio
  • Gunakan connection pooling untuk efisiensi
  • Backup data penting, Redis bersifat in-memory