Memahami lapisan caching dari browser hingga database, pola cache-aside/read-through/write-through/write-behind, serta masalah umum seperti thundering herd, cache stampede, dan hot key yang sering muncul di production

Setelah di episode 2 kita memahami scalability horizontal dan load balancing, pada episode ini kita masuk ke teknik yang paling sering membuat perbedaan dramatis dalam performa sistem: caching. Caching adalah prinsip sederhana: simpan hasil komputasi yang mahal di lokasi yang cepat diakses, sehingga request berikutnya tidak perlu mengulangi komputasi yang sama.
Cache adalah salah satu dari sedikit optimasi yang bisa mengurangi latency dari ratusan milidetik menjadi mikrodetik — penurunan 1000x. Tapi caching juga membawa masalah tersendiri: data stale, thundering herd, dan invalidation yang kompleks. Di episode ini kita bedah lapisan, pola, dan pitfalls caching secara lengkap.
Sistem modern punya beberapa lapisan caching yang bekerja bersama:
Browser menyimpan static assets (CSS, JS, gambar) secara lokal. Kontrol dilakukan lewat HTTP headers:
Cache-Control: max-age=31536000, immutable
ETag: "abc123"
Last-Modified: Wed, 16 Aug 2026 00:00:00 GMTCache-Control menentukan berapa lama resource di-cache. ETag dan Last-Modified memungkinkan conditional request (304 Not Modified).
CDN (CloudFlare, CloudFront) menyimpan copy konten di server yang dekat secara geografis dengan pengguna.
/style.v2.css).Lapisan caching di aplikasi, menyimpan data yang sering diakses dalam memori.
| Tool | Kelebihan | Kapan Pakai |
|---|---|---|
| Redis | Data structures kaya, persistence, pub/sub, clustering | Session store, rate limiting, leaderboard, caching umum |
| Memcached | Simpel, multithreaded, high throughput | Simple key-value caching, high-throughput read |
Beberapa database punya built-in query cache:
Pola paling umum: aplikasi mengecek cache dulu; jika miss, query database lalu simpan ke cache.
1. App check cache → HIT → return data
2. App check cache → MISS → query DB → write to cache → return dataKelebihan: hanya cache data yang benar-benar diakses (lazy). Kekurangan: cold start (cache miss pertama selalu lambat), data bisa stale.
Cache bertanggung jawab load data dari database saat miss — aplikasi hanya berinteraksi dengan cache.
Kelebihan: aplikasi lebih sederhana. Kekurangan: cache layer lebih kompleks.
Setiap write ke database juga ditulis ke cache secara synchron.
Kelebihan: cache selalu konsisten dengan DB. Kekurangan: write latency meningkat (dua operasi).
Write ke cache, lalu asynchronously flush ke database.
Kelebihan: write latency rendah (hanya ke cache). Kekurangan: risk data loss jika cache crash sebelum flush, complexity tinggi.
| Pola | Read Latency | Write Latency | Data Freshness | Complexity |
|---|---|---|---|---|
| Cache-Aside | Rendah (cache hit) | Normal (ke DB) | Stale possible | Rendah |
| Read-Through | Rendah | Normal | Stale possible | Menengah |
| Write-Through | Rendah | Tinggi (sync dua tulis) | Konsisten | Menengah |
| Write-Behind | Rendah | Sangat rendah | Delayed | Tinggi |
"In the two hard things in computer science are cache invalidation and naming things." — Phil Karlton
Setiap entry cache punya waktu kadaluarsa. Setelah TTL habis, data dianggap stale dan dihapus.
SET user:1234 {"name": "Budi"} EX 3600
# Data expire dalam 3600 detik (1 jam)Kelebihan: sederhana, otomatis. Kekurangan: data bisa stale sampai TTL habis; terlalu pendek = banyak cache miss.
Hapus cache saat data berubah. Contoh: setelah update user di DB, hapus user:1234 dari cache.
Kelebihan: data lebih fresh. Kekurangan: butuh mekanisme publish-subscribe atau message queue untuk koordinasi.
Saat cache expired secara bersamaan, banyak request langsung menghantam database secara serentak.
Cache expired → 1000 request MISS → 1000 query DB → DB overloadSolusi:
Mirip thundering herd tapi pada data yang sama yang belum pernah di-cache (cold start).
Solusi: pre-warming cache saat deployment, atau gunakan request coalescing (gabungkan beberapa request yang sama menjadi satu query DB).
Satu key di-cache yang diakses sangat sering — menjadi bottleneck di satu Redis/Memcached node.
Solusi: local cache di aplikasi (L1 cache), replication key ke beberapa node, atau client-side caching.
Saat aplikasi baru deploy atau restart, cache masih kosong. Semua request pertama kali menghantam database.
Solusi: cache warming script yang pre-load data populer ke cache saat startup.
Warning
Jangan pernah underestimate masalah cache invalidation. Banyak bug production disebabkan oleh data stale karena invalidation yang tidak tepat. Selalu tanyakan: "apa yang terjadi pada cache saat data di database berubah?"
Inti yang harus dibawa pulang:
Di episode 4 selanjutnya kita akan membahas database fundamentals untuk scale — SQL vs NoSQL, replikasi leader-follower, dan partitioning/sharding. Caching membantu performa read, tapi database adalah fondasi data yang menentukan arsitektur seluruh sistem!