Paket 2 · Praktik LanjutanModul E — Performance, Cache & Application Infrastructure

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

PolaCara kerjaCatatan
Cache-asideApp cek cache, miss → DB → isi cachePaling umum
Read-throughCache yang mengambil dari DBAbstraksi lebih kompleks
Write-throughTulis ke cache dan DBKonsisten, write lebih lambat
Write-behindTulis cache, flush ke DB nantiRisiko 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 detik

Cache 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

TipeKegunaan
StringCache sederhana, counter
HashObjek (session, profil)
ListQueue sederhana
SetTag, unique visitors
Sorted SetLeaderboard, rate limit berbobot
StreamEvent log/queue

Persistence

ModeCaraTrade-off
RDBSnapshot berkalaCepat, bisa kehilangan data terakhir
AOFLog setiap writeLebih tahan, file lebih besar
RDB + AOFKombinasiSeimbang
save 900 1
save 300 10
appendonly yes
appendfsync everysec

Untuk cache murni, persistence bisa dimatikan. Untuk session/queue, persistence penting.

Memory dan eviction

maxmemory 512mb
maxmemory-policy allkeys-lru
PolicyArti
noevictionTolak write saat penuh
allkeys-lruBuang key paling lama dipakai
volatile-lruBuang key dengan TTL
allkeys-lfuBuang 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

ModeFungsi
ReplicaRead scaling dan cadangan
SentinelFailover otomatis
ClusterSharding 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 MONITOR

Metrik 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 foo

Ringkasan

  • 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

On this page