Redis Caching Strategies: Optimasi Performa Aplikasi Web
Database query yang lambat adalah bottleneck paling umum di aplikasi web. Redis solve masalah ini dengan menyimpan data yang sering diakses di memory, bukan di disk. Hasilnya: response time dari ratusan milidetik jadi kurang dari 1 milidetik.
Apa Itu Redis?
Redis (Remote Dictionary Server) adalah in-memory data store yang berfungsi sebagai cache, database, dan message broker. Data disimpan di RAM, jadi aksesnya sangat cepat. Redis mendukung berbagai data structure: string, hash, list, set, sorted set, dan stream.
Caching Strategies
1. Cache-Aside (Lazy Loading)
Strategy paling umum. Aplikasi cek cache dulu, kalau miss baru query database dan simpan hasilnya di cache.
async function getUser(id) {
// 1. Cek cache
const cached = await redis.get(`user:${id}`);
if (cached) return JSON.parse(cached);
// 2. Cache miss - query database
const user = await db.query('SELECT * FROM users WHERE id = ?', [id]);
// 3. Simpan di cache (TTL 1 jam)
await redis.setex(`user:${id}`, 3600, JSON.stringify(user));
return user;
}
Kapan pakai: Data yang sering dibaca tapi jarang diubah (user profile, product catalog).
2. Write-Through
Setiap kali data ditulis ke database, langsung tulis juga ke cache. Cache selalu up-to-date.
async function updateUser(id, data) {
// 1. Tulis ke database
await db.query('UPDATE users SET ? WHERE id = ?', [data, id]);
// 2. Update cache
await redis.setex(`user:${id}`, 3600, JSON.stringify({ id, ...data }));
}
Kapan pakai: Data yang sering dibaca DAN sering diubah, tapi konsistensi kritis.
3. Write-Behind (Write-Back)
Tulis ke cache dulu, lalu async tulis ke database. Lebih cepat, tapi ada risiko data loss kalau cache crash sebelum data sampai ke database.
Kapan pakai: High-write workload yang bisa toleransi sedikit data loss (analytics, logging).
Cache Invalidation
Ini adalah bagian paling tricky dari caching. Kapan data di cache harus dihapus atau diupdate?
- TTL (Time To Live): Set expiry time. Data otomatis hilang setelah waktu tertentu
- Event-based: Hapus cache saat data di-update (pub/sub pattern)
- Version-based: Tambahkan version number di cache key. Update version saat data berubah
Redis Patterns yang Umum
Rate Limiting
async function isRateLimited(ip) {
const key = `rate:${ip}`;
const count = await redis.incr(key);
if (count === 1) await redis.expire(key, 60); // 1 minute window
return count > 100; // max 100 requests per minute
}
Session Store
async function createSession(userId) {
const sessionId = crypto.randomUUID();
await redis.setex(`session:${sessionId}`, 86400, userId); // 24h
return sessionId;
}
Kesimpulan
Redis caching adalah optimasi performa yang paling impactful untuk kebanyakan aplikasi web. Mulai dari cache-aside untuk data yang sering dibaca, tambahkan TTL untuk expiry, dan iterate sesuai kebutuhan. Satu perubahan kecil bisa bikin response time 10-100x lebih cepat.
Mau belajar backend optimization? Kunjungi everdev.pro.