Caching & Redis untuk Production
Menerapkan pola cache, Redis untuk session dan rate limit, konfigurasi persistence, eviction, keamanan, dan HA.
Cache mengurangi latency dan beban database. Redis adalah pilihan populer karena cepat, mendukung banyak struktur data, dan bisa dipakai untuk session, rate limit, queue, dan leaderboard.
Pola caching
| Pola | Cara kerja | Catatan |
|---|---|---|
| Cache-aside | App cek cache, miss → DB → isi cache | Paling umum |
| Read-through | Cache yang mengambil dari DB | Abstraksi lebih kompleks |
| Write-through | Tulis ke cache dan DB | Konsisten, write lebih lambat |
| Write-behind | Tulis cache, flush ke DB nanti | Risiko kehilangan data |
Cache-aside
async function getUser(id) {
const key = `user:${id}`;
const cached = await redis.get(key);
if (cached) return JSON.parse(cached);
const user = await db.getUser(id);
if (user) {
await redis.set(key, JSON.stringify(user), 'EX', 300);
}
return user;
}TTL dan invalidasi
- TTL membatasi umur cache.
- Invalidasi menghapus cache saat data berubah.
- Versioning key membantu saat format berubah.
await redis.del(`user:${id}`); // setelah update
await redis.set(key, value, 'EX', 60); // 60 detikCache stampede
Jika banyak request cache miss bersamaan, database bisa dibanjiri. Gunakan lock singkat, jitter TTL, atau single-flight untuk mencegahnya.
Redis untuk session
import session from 'express-session';
import RedisStore from 'connect-redis';
app.use(session({
store: new RedisStore({ client: redis }),
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: true,
secure: true,
sameSite: 'lax',
maxAge: 1000 * 60 * 60 * 8,
},
}));Dengan session di Redis, semua instance aplikasi bisa melayani pengguna yang sama.
Rate limit
const key = `rate:${ip}`;
const count = await redis.incr(key);
if (count === 1) await redis.expire(key, 60);
if (count > 100) return res.status(429).send('Too Many Requests');Redis cocok untuk rate limit terdistribusi.
Struktur data Redis
| Tipe | Kegunaan |
|---|---|
| String | Cache sederhana, counter |
| Hash | Objek (session, profil) |
| List | Queue sederhana |
| Set | Tag, unique visitors |
| Sorted Set | Leaderboard, rate limit berbobot |
| Stream | Event log/queue |
Persistence
| Mode | Cara | Trade-off |
|---|---|---|
| RDB | Snapshot berkala | Cepat, bisa kehilangan data terakhir |
| AOF | Log setiap write | Lebih tahan, file lebih besar |
| RDB + AOF | Kombinasi | Seimbang |
save 900 1
save 300 10
appendonly yes
appendfsync everysecUntuk cache murni, persistence bisa dimatikan. Untuk session/queue, persistence penting.
Memory dan eviction
maxmemory 512mb
maxmemory-policy allkeys-lru| Policy | Arti |
|---|---|
noeviction | Tolak write saat penuh |
allkeys-lru | Buang key paling lama dipakai |
volatile-lru | Buang key dengan TTL |
allkeys-lfu | Buang key paling jarang dipakai |
Pilih policy sesuai data: cache boleh evict, session sebaiknya tidak.
Keamanan Redis
bind 127.0.0.1 10.10.10.30
protected-mode yes
requirepass password-kuat
rename-command FLUSHALL ""
rename-command CONFIG ""- Jangan expose Redis ke internet.
- Gunakan password/TLS.
- Batasi akses lewat firewall.
- Jalankan sebagai user non-root.
HA Redis
| Mode | Fungsi |
|---|---|
| Replica | Read scaling dan cadangan |
| Sentinel | Failover otomatis |
| Cluster | Sharding horizontal |
Untuk banyak kasus, replica + Sentinel cukup. Cluster diperlukan saat data melebihi satu node.
Monitoring Redis
redis-cli INFO stats
redis-cli INFO memory
redis-cli INFO replication
redis-cli --latency
redis-cli MONITORMetrik penting: hit rate, evicted keys, used memory, connected clients, latency.
Praktik: menyiapkan Redis
docker run -d --name redis \
-p 127.0.0.1:6379:6379 \
-v redis-data:/data \
redis:7-alpine \
redis-server --appendonly yes --requirepass "$REDIS_PASSWORD"Uji:
redis-cli -a "$REDIS_PASSWORD" ping
redis-cli -a "$REDIS_PASSWORD" set foo bar EX 60
redis-cli -a "$REDIS_PASSWORD" get fooRingkasan
- Cache-aside adalah pola paling umum.
- TTL dan invalidasi mencegah data basi.
- Redis cocok untuk session, rate limit, queue, dan cache.
- Persistence, eviction, keamanan, dan HA harus dikonfigurasi untuk produksi.
Selanjutnya
Atur koneksi aplikasi di Connection Pooling & Application Performance.
Performance Engineering & Resource Management
Mengukur dan meningkatkan performa aplikasi: latency, throughput, profiling, load testing, dan alokasi resource.
Connection Pooling & Application Performance
Mengelola connection pool database, PgBouncer, HTTP keep-alive, timeout, dan pola aplikasi yang menjaga performa.