Cache: Mempercepat Aplikasi
Menyimpan hasil yang mahal dengan Cache::remember, flexible, touch, invalidasi, tag, dan lock.
Mengapa cache?
Beberapa pekerjaan mahal: query berat, agregasi laporan, panggilan API pihak ketiga. Jika hasilnya jarang berubah, hitung sekali, simpan sebentar di tempat yang cepat, dan layani permintaan berikutnya dari sana. Hasilnya: respons milidetik alih-alih detik, dan beban database turun drastis.
Driver cache
Diatur di config/cache.php / CACHE_STORE. Bawaan proyek baru: database (tanpa instalasi tambahan). Untuk performa: Redis atau Memcached. Ada pula file, array (untuk tes), storage, dynamodb, dan driver failover yang otomatis beralih ke store cadangan bila store utama gagal.
Operasi dasar
use Illuminate\Support\Facades\Cache;
Cache::put('kunci', 'nilai', 600); // simpan 600 detik
Cache::get('kunci', 'bawaan'); // baca (atau nilai bawaan)
Cache::has('kunci');
Cache::forget('kunci'); // hapus
Cache::forever('kunci', 'nilai'); // tanpa kedaluwarsa
Cache::add('kunci', 'nilai', 600); // hanya jika belum ada (atomik)
Cache::increment('kunjungan'); // penghitung
remember: pola yang paling berguna
$populer = Cache::remember('produk:populer', 600, function () {
return Produk::tersedia()->orderByDesc('terjual')->limit(10)->get();
});
Cache hit → langsung dikembalikan; miss → closure dijalankan, hasil disimpan lalu dikembalikan. Satu baris menggantikan blok if-else.
flexible: stale-while-revalidate (baru)
$detail = Cache::flexible("produk:{$id}", [60, 300], fn () => Produk::with('kategori')->findOrFail($id));
Array [60, 300]: data dianggap segar selama 60 detik; antara 60–300 detik data basi tetap dilayani sementara versi baru dihitung di latar belakang; lewat 300 detik dihitung ulang langsung. Pengguna hampir tidak pernah menunggu perhitungan ulang.
touch: memperpanjang umur — baru di Laravel 13
Cache::touch('promo:aktif', 3600); // perpanjang TTL tanpa membaca & menyimpan ulang nilainya
// true bila item ada dan diperpanjang; false bila tak ada
Memoization: hanya sekali per request
Cache::memo()->get('kunci'); // pemanggilan berikutnya di request yang sama diambil dari memori
Invalidasi: bagian tersulit
Ada pepatah: "Hanya ada dua hal sulit dalam ilmu komputer: invalidasi cache dan menamai sesuatu." Aturan praktis: saat data sumber berubah, hapus kunci cache terkait:
public function perbarui(Produk $produk, array $data): Produk
{
$produk->update($data);
Cache::forget("produk:{$produk->id}");
Cache::forget('produk:populer');
return $produk;
}
Gunakan kunci yang konsisten dan deskriptif (produk:12, laporan:harian:2026-10-08). Atau pasang di observer model agar otomatis.
Tag (Redis/Memcached)
Cache::tags(['produk', 'katalog'])->put('daftar', $data, 600);
Cache::tags('produk')->flush(); // hapus SEMUA entri bertag "produk"
Tag tidak didukung driver file, database, storage, dan dynamodb.
Atomic lock: mencegah balapan
Cache::lock('laporan:harian', 120)->get(function () {
// hanya satu proses yang boleh masuk; lock otomatis dilepas setelah selesai
});
Cache::lock('laporan:harian', 120)->block(5, function () { /* tunggu maksimal 5 detik */ });
Cache::withoutOverlapping('impor', fn () => /* ... */);
Hati-hati
- Jangan men-cache data khusus pengguna dengan kunci yang sama untuk semua orang.
- Laravel 13 menambah opsi
serializable_classesdiconfig/cache.php(bawaanfalse) untuk memperkeras deserialisasi cache: bila kamu menyimpan objek PHP di cache, daftarkan kelasnya; atau simpan array biasa. Menyimpan array/ID lebih aman & portabel. - Cache bisa hilang kapan saja — jangan jadikan satu-satunya penyimpanan data penting.
- Perintah:
php artisan cache:clear,config:cache,route:cache,view:cache,optimize.