Cache: Mempercepat Aplikasi
Simpan hasil query berat di cache dengan remember(), atur TTL, dan invalidasi yang tepat.
Pola dasar: remember()
Cache::remember() adalah pola paling sering dipakai: ambil dari cache kalau ada, kalau tidak ada jalankan closure lalu simpan hasilnya.
use Illuminate\Support\Facades\Cache;
$populer = Cache::remember('posts.populer', 3600, function () {
return Post::withCount('komentar')
->orderByDesc('komentar_count')
->take(10)
->get();
});
// 3600 = detik (1 jam). Setelah itu dihitung ulang otomatis.Untuk development, driver file (default) sudah cukup. Untuk production pakai redis atau memcached yang jauh lebih cepat dan mendukung tags.
Invalidasi: bagian tersulit dari cache
Cache basi adalah bug yang menyebalkan. Setiap kali data berubah, hapus cache terkait:
// Saat post dibuat/diupdate/dihapus
Cache::forget('posts.populer');
// Atau otomatis via model event di AppServiceProvider
Post::saved(fn () => Cache::forget('posts.populer'));
Post::deleted(fn () => Cache::forget('posts.populer'));Aturan praktis: beri nama key yang jelas dan hapus di semua tempat data berubah. Lebih baik hapus agresif daripada menampilkan data basi.
Cache tags (butuh redis/memcached)
Untuk menghapus sekelompok cache sekaligus:
Cache::tags(['posts', 'homepage'])->remember('posts.populer', 3600, fn () =>
Post::populer()->take(10)->get()
);
// Hapus semua cache bertag 'posts' sekaligus
Cache::tags(['posts'])->flush();Hal yang tidak boleh di-cache
Jangan cache data yang personal per user dengan key global (misalnya dashboard user A terlihat oleh user B). Sertakan ID user di key: "dashboard.".$user->id. Dan jangan cache query yang memang harus real-time seperti stok atau saldo.
Catatan teknis: Driver
filedandatabasetidak mendukung tags. Kalau kode memakaiCache::tags()dengan driver file, Laravel melempar exception. Putuskan driver sejak awal: development boleh file, tapi staging/production samakan dengan production (redis) supaya tidak ada kejutan.