Caching Strategies
Apa itu Caching?
Secara sederhana, caching adalah proses menyimpan salinan data di lokasi penyimpanan sementara (yang disebut cache) yang memiliki kecepatan akses lebih tinggi daripada sumber data aslinya. Tujuannya adalah untuk mempercepat permintaan data di masa mendatang dan mengurangi beban pada sistem utama (seperti database).
## 1. Cache Aside (Lazy Loading)
Ini adalah strategi caching yang paling umum dan intuitif. Aplikasi bertanggung jawab penuh untuk mengelola data antara cache dan database.
Cara Kerja:
Pembacaan (Read):
Aplikasi pertama-tama mencari data di cache.
Jika data ditemukan (Cache Hit), data tersebut langsung dikembalikan ke klien.
Jika data tidak ditemukan (Cache Miss), aplikasi akan mengambil data dari database.
Setelah data didapat dari database, aplikasi akan menyimpannya ke dalam cache untuk permintaan berikutnya.
Data tersebut kemudian dikembalikan ke klien.
Penulisan (Write): Aplikasi menulis data langsung ke database dan biasanya akan menghapus data yang sesuai di cache (invalidasi).
Kelebihan:
Resilien: Jika cache mengalami kegagalan, aplikasi masih bisa berjalan dengan mengambil data langsung dari database, meskipun lebih lambat.
Model Data Sederhana: Cache hanya menyimpan data yang benar-benar diminta, sehingga tidak terbebani oleh data yang jarang diakses.
Mudah Diimplementasikan: Logikanya cukup sederhana dan berada sepenuhnya di level aplikasi.
Kekurangan:
Latency pada Cache Miss: Permintaan pertama untuk data yang belum ada di cache akan lebih lambat karena harus melalui tiga langkah: cek cache, ambil dari DB, dan simpan ke cache.
Data Basi (Stale Data): Ada kemungkinan data di cache tidak sinkron dengan di database jika ada pembaruan di database yang tidak diikuti dengan invalidasi cache.
Contoh Implementasi (Go, GORM, Redis):
Anggap kita memiliki redisClient untuk interaksi dengan Redis dan db untuk GORM.
## 2. Read Through
Strategi ini mirip dengan Cache Aside, namun logikanya dipindahkan dari aplikasi ke cache provider itu sendiri. Aplikasi hanya berinteraksi dengan cache.
Cara Kerja:
Aplikasi meminta data dari cache.
Jika data ada (Cache Hit), cache mengembalikannya.
Jika data tidak ada (Cache Miss), cache provider (bukan aplikasi) akan mengambil data dari database, menyimpannya di cache, lalu mengembalikannya ke aplikasi.
Kelebihan:
Logika Aplikasi Lebih Bersih: Aplikasi tidak perlu tahu dari mana data berasal (cache atau DB). Cukup bertanya ke cache.
Konsistensi Logika: Logika pengambilan data terpusat di cache provider.
Kekurangan:
Ketergantungan pada Fitur Provider: Membutuhkan cache provider yang mendukung fungsionalitas ini (misalnya, Redis dengan modul tambahan atau cache custom). Implementasi out-of-the-box pada library Redis standar tidak ada.
Lebih Kompleks di Awal: Konfigurasi cache provider menjadi lebih rumit.
Contoh Implementasi (Go - Konseptual):
Karena ini bergantung pada provider, kode di level aplikasi akan terlihat sangat sederhana. Logika utamanya berada di dalam implementasi CacheService.
## 3. Write Through
Strategi ini memastikan data di cache dan database selalu sinkron saat operasi tulis.
Cara Kerja:
Aplikasi menulis data ke cache.
Cache provider secara sinkron (menunggu hingga selesai) menulis data tersebut ke database.
Operasi tulis dianggap selesai hanya setelah data berhasil disimpan di cache DAN di database.
Kelebihan:
Konsistensi Data Tinggi: Data di cache dan database selalu sama setelah operasi tulis berhasil. Pembacaan tidak akan pernah mendapatkan data basi.
Beban Baca Terjamin Rendah: Karena data selalu ada di cache setelah ditulis, operasi baca berikutnya dijamin cache hit.
Kekurangan:
Latency Tulis Tinggi: Aplikasi harus menunggu konfirmasi dari dua sistem (cache dan database), sehingga proses penulisan menjadi lebih lambat.
Tidak Mengurangi Beban Tulis ke DB: Setiap operasi tulis tetap akan membebani database.
Contoh Implementasi (Go):
## 4. Write Back (Write Behind)
Strategi ini mengutamakan kecepatan tulis dengan menunda penulisan ke database.
Cara Kerja:
Aplikasi menulis data hanya ke cache. Operasi dianggap selesai dan aplikasi mendapat respons cepat.
Cache akan menandai data ini sebagai "kotor" (dirty).
Secara asinkron (di latar belakang), setelah beberapa waktu atau dalam batch, cache akan menulis data yang "kotor" tersebut ke database.
Kelebihan:
Latency Tulis Sangat Rendah: Aplikasi tidak perlu menunggu penulisan ke database. Sangat cocok untuk aplikasi dengan beban tulis yang sangat tinggi.
Mengurangi Beban Tulis DB: Beberapa pembaruan pada data yang sama dalam waktu singkat dapat digabungkan menjadi satu kali penulisan ke database.
Kekurangan:
Risiko Kehilangan Data: Jika cache mati atau mengalami crash sebelum data sempat ditulis ke database, data tersebut akan hilang permanen.
Kompleksitas Implementasi: Membutuhkan mekanisme antrian (queue) atau worker di latar belakang untuk memproses penulisan ke database.
Contoh Implementasi (Go - Konseptual):
## 5. Write Around
Strategi ini memprioritaskan agar cache tidak diisi oleh data yang mungkin jarang dibaca.
Cara Kerja:
Operasi tulis (Create/Update) dilakukan langsung ke database, sepenuhnya melewati (around) cache.
Data hanya akan masuk ke cache saat ada operasi baca yang mengalami Cache Miss (sama seperti alur baca pada Cache Aside).
Kelebihan:
Cache Efisien: Mencegah cache dipenuhi data yang baru ditulis tapi mungkin tidak akan pernah dibaca kembali. Cocok untuk data log atau arsip.
Latency Tulis Baik: Sama seperti menulis langsung ke database, tidak ada overhead penulisan ke cache.
Kekurangan:
Latency Baca Tinggi untuk Data Baru: Permintaan baca sesaat setelah data ditulis akan selalu menjadi Cache Miss, sehingga lebih lambat.
Contoh Implementasi (Go):
Kombinasi dari fungsi baca Cache Aside dan fungsi tulis yang hanya ke DB.
Ringkasan dan Kapan Menggunakannya
Cache Aside
Kasus umum, read-heavy, toleran data basi sesaat
Fleksibel, Resilien
Latency pada cache miss
Read Through
Ingin logika aplikasi bersih, read-heavy
Kode aplikasi simpel
Butuh dukungan provider
Write Through
Data kritis, butuh konsistensi tinggi (cth: data finansial)
Konsistensi data tinggi
Latency tulis tinggi
Write Back
Aplikasi write-heavy, butuh performa tulis super cepat
Latency tulis sangat rendah
Risiko kehilangan data
Write Around
Data ditulis sekali, jarang dibaca (cth: log, analitik)
Cache tidak "tercemar"
Latency baca tinggi untuk data baru
Konteks Proyek (Go, Postgres, GORM, Docker)
Dalam lingkungan Docker, Anda akan menjalankan beberapa kontainer:
Aplikasi Go Anda: Berisi logika bisnis dan implementasi strategi caching yang dipilih.
Database PostgreSQL: Sumber data utama.
Cache Server (misalnya, Redis): Penyimpanan cache.
Anda dapat mendefinisikannya dalam file docker-compose.yml:
Untuk proyek Anda, Cache Aside adalah titik awal yang paling umum dan paling aman untuk diimplementasikan karena keseimbangan antara kemudahan implementasi dan manfaat performa yang didapat.
Last updated