LaravelCachePerformaMahir4 mnt baca

Cache: Hindari Query Berulang

Cache hasil query mahal dengan remember().

Kenapa Cache Mengubah Segalanya

Setiap request yang menjalankan 50 query database 200 ms terasa lambat bagi user dan mahal bagi server. Cache memotong rantai itu: hasil query disimpan di memori cepat (file, Redis), request berikutnya mengambilnya dalam 2 ms tanpa menyentuh database sama sekali. Untuk halaman yang dibaca ribuan kali tapi jarang berubah (homepage, daftar kategori, konfigurasi), cache adalah optimasi termurah dengan dampak terbesar.

Pola remember()

php
// app/Http/Controllers/HomeController.php
namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Support\Facades\Cache;

class HomeController extends Controller
{
    public function index()
    {
        // closure HANYA jalan saat cache miss
        $populer = Cache::remember('posts.populer', 3600, function () {
            return Post::with('user')
                ->orderByDesc('views')
                ->take(10)
                ->get();
        });

        return view('home', compact('populer'));
    }
}

remember(kunci, detik, closure) artinya: kalau kunci ada, kembalikan langsung; kalau tidak, jalankan closure, simpan hasilnya, lalu kembalikan. Ada juga rememberForever() untuk data yang hampir tidak pernah berubah (daftar provinsi), tapi ingat: "forever" tetap butuh strategi hapus.

Invalidasi: Bagian yang Sering Dilupakan

Cache tanpa invalidasi adalah bug yang menunggu waktu: user mengubah judul post, tapi homepage menampilkan judul lama selama satu jam. Solusi profesional: hapus cache tepat saat data berubah, memakai Eloquent observer.

php
// app/Observers/PostObserver.php
namespace App\Observers;

use App\Models\Post;
use Illuminate\Support\Facades\Cache;

class PostObserver
{
    public function saved(Post $post): void
    {
        Cache::forget('posts.populer');
    }

    public function deleted(Post $post): void
    {
        Cache::forget('posts.populer');
    }
}

Daftarkan di provider:

php
// app/Providers/AppServiceProvider.php (method boot)
use App\Models\Post;
use App\Observers\PostObserver;

Post::observe(PostObserver::class);

Sekarang setiap create/update/delete Post otomatis membersihkan cache. Data selalu fresh tanpa menunggu TTL habis. Pola ini disebut write-through invalidation dan jauh lebih bisa diandalkan daripada sekadar mengandalkan TTL pendek.

Cache Tags: Hapus Sekelompok

Kalau kamu cache banyak hal terkait post (daftar populer, jumlah per kategori, sitemap), menghapus satu per satu melelahkan. Dengan driver Redis/Memcached, pakai tags:

php
$populer = Cache::tags(['posts'])->remember('posts.populer', 3600, fn () => ...);
$arsip   = Cache::tags(['posts'])->remember('posts.arsip', 3600, fn () => ...);

// satu perintah menghapus semua yang ber-tag 'posts'
Cache::tags(['posts'])->flush();

Catatan: tags TIDAK didukung driver file dan database. Kalau butuh tags, pakai Redis.

Driver: Pilih Sesuai Kebutuhan

bash
# .env
CACHE_STORE=file      # default, simpel, 1 server
CACHE_STORE=database  # butuh php artisan cache:table + migrate
CACHE_STORE=redis     # multi-server, tercepat, dukung tags & lock

Aturan praktis: development dan VPS tunggal cukup file. Begitu ada 2 server (load balancer) atau butuh tags/atomic lock, wajib Redis, karena cache file di server A tidak terlihat oleh server B.

Jebakan Umum

Cache stampede. Cache kedaluwarsa tepat saat 1000 user request bersamaan: 1000 query berat menghantam DB sekaligus. Laravel punya Cache::flexible() (atau pola lock manual) agar hanya satu request yang me-regenerate cache sementara yang lain memakai data sedikit basi.

Menyimpan data spesifik user di kunci global. Cache::remember('dashboard', ...) yang berisi data user A akan ditampilkan ke user B. Selalu sertakan identitas di kunci: 'dashboard.user.'.$user->id.

Cache::flush() di production. Menghapus SEMUA cache sekaligus membuat semua request berikutnya menghantam database bersamaan. Pakai forget() yang spesifik atau tags.

Menyimpan objek raksasa. Serialisasi 10.000 model Eloquent ke cache itu berat dan lambat. Cache hasil yang sudah diringkas (array/collection kecil), bukan dump mentah.

Catatan teknis: Selain data, Laravel juga memakai cache untuk route (route:cache), config (config:cache), dan view. Setelah deploy, jalankan php artisan optimize untuk meng-cache semuanya sekaligus. Tapi ingat: kalau .env berubah setelah config:cache, perubahan tidak terbaca sampai kamu jalankan config:clear atau optimize ulang. Ini sumber kebingungan klasik saat deploy pertama.

Tantangan

Cache Homepage

Cache daftar 10 post terpopuler di homepage dengan remember() 5 menit. Buktikan dengan query log: refresh kedua tidak menjalankan query post lagi.