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 3600menyimpan dengan expire 3600 detikSETEX key 3600 valuealternatif untuk set dengan TTL
GET
GET keymengambil nilai dari cache- Mengembalikan nilai atau nil jika key tidak ada
DEL
DEL keymenghapus key dari cache- Bisa menerima banyak key sekaligus
EXISTS
EXISTS keymemeriksa apakah key ada- Mengembalikan 1 jika ada, 0 jika tidak
TTL
TTL keymengecek 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-lrumenghapus key yang paling jarang digunakanallkeys-lfumenghapus key dengan frekuensi akses terendahvolatile-lruhanya 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