laravelcacheperformaMahir3 mnt baca

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.

php
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:

php
// 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:

php
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 file dan database tidak mendukung tags. Kalau kode memakai Cache::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.