Teknik rehber

Laravel Cache Stratejileri ve Tutarlılık Tercihleri: Uygulamalı Bir Rehber

Laravel'de cache kullanımı performansı artırırken tutarlılık risklerini de beraberinde getirir. Bu yazıda, resmi dokümantasyona dayalı olarak cache sürücüleri, stratejiler ve tutarlılık tercihlerini uygulamalı örneklerle ele alıyoruz.

Yazılım geliştirme ve kodlama görseli
Görsel: Unsplash · Görsel kaynağı

Giriş

Laravel, web uygulamalarında performansı artırmak için güçlü bir cache altyapısı sunar. Ancak cache kullanımı, veri tutarlılığı konusunda dikkatli bir planlama gerektirir. Özellikle yüksek trafikli uygulamalarda, cache'in ne zaman ve nasıl geçersiz kılınacağı kritik bir karardır. Bu yazıda, Laravel 13 ve PHP resmi dokümantasyonuna dayanarak cache stratejilerini ve tutarlılık tercihlerini inceliyoruz.

Laravel Cache Sürücüleri ve Yapılandırma

Laravel, config/cache.php dosyası üzerinden yapılandırılan çeşitli cache sürücülerini destekler: file, database, memcached, redis, dynamodb ve array. Varsayılan olarak file sürücüsü kullanılır, ancak üretim ortamında redis veya memcached gibi daha hızlı çözümler tercih edilir. Resmi dokümantasyona göre, array sürücüsü yalnızca testler için uygundur ve kalıcı değildir.

Cache sürücüsünü değiştirmek için .env dosyasında CACHE_STORE değişkenini ayarlayabilirsiniz. Örneğin, Redis kullanmak için:

CACHE_STORE=redis

Redis sürücüsü için phpredis veya predis paketini yüklemeniz gerekir. Laravel 13, PHP 8.2 ve üzerini destekler; bu nedenle Redis uzantısının uyumlu olduğundan emin olun.

Cache Stratejileri

1. Cache-Aside (Lazy Loading)

En yaygın strateji olan cache-aside, veriyi önce cache'de arar; bulamazsa veritabanından çeker ve cache'e yazar. Laravel'de Cache::remember metodu bu işlevi sağlar:

use Illuminate\Support\Facades\Cache;

$users = Cache::remember('users.all', 3600, function () {
    return User::all();
});

Bu yöntem basittir ancak cache invalidation (geçersiz kılma) manuel yapılmalıdır. Veri güncellendiğinde Cache::forget('users.all') çağrılmalıdır.

2. Write-Through

Write-through stratejisinde, veri hem veritabanına hem de cache'e aynı anda yazılır. Laravel'de doğrudan bir metot yoktur; ancak model olayları (events) ile uygulanabilir:

protected static function booted()
{
    static::saved(function ($user) {
        Cache::put('user.'.$user->id, $user, 3600);
    });
}

Bu yaklaşım, okuma sırasında cache'in her zaman güncel olmasını sağlar, ancak yazma maliyetini artırır.

3. Write-Behind (Write-Back)

Write-behind, veriyi önce cache'e yazıp asenkron olarak veritabanına yazmayı hedefler. Laravel'de kuyruk (queue) sistemi ile uygulanabilir. Ancak bu strateji, veri kaybı riski taşıdığı için dikkatli kullanılmalıdır.

Tutarlılık Tercihleri

Cache tutarlılığı, dağıtık sistemlerde zorlu bir konudur. Laravel'de tutarlılığı sağlamak için şu tercihler öne çıkar:

  • TTL (Time-To-Live): Cache verisinin ne kadar süreyle geçerli olacağını belirler. Kısa TTL, tutarlılığı artırır ancak performansı düşürür.
  • Cache Tags: Redis ve Memcached gibi sürücülerde etiketleme yapılabilir. İlgili verileri toplu olarak geçersiz kılmak için kullanışlıdır.
  • Versioning: Cache anahtarlarına versiyon ekleyerek eski verilerin otomatik olarak geçersiz sayılmasını sağlayabilirsiniz.

Resmi dokümantasyona göre, Cache::tags yalnızca redis, memcached ve dynamodb sürücüleriyle çalışır. file sürücüsü etiketlemeyi desteklemez.

Uygulamalı Örnek: Ürün Listesi Cache'leme

Aşağıda, bir e-ticaret uygulamasında ürün listesini cache'leyen ve güncelleme sırasında cache'i geçersiz kılan bir örnek verilmiştir:

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

class ProductController extends Controller
{
    public function index()
    {
        $products = Cache::remember('products.all', 600, function () {
            return Product::with('category')->get();
        });

        return view('products.index', compact('products'));
    }

    public function update(Request $request, Product $product)
    {
        $product->update($request->validated());
        Cache::forget('products.all');
        return redirect()->route('products.index');
    }
}

Bu örnekte, ürünler 10 dakika (600 saniye) boyunca cache'de tutulur. Herhangi bir ürün güncellendiğinde Cache::forget ile cache temizlenir ve bir sonraki istekte güncel veri çekilir.

Sonuç

Laravel cache stratejileri, uygulamanızın performansını önemli ölçüde artırabilir. Ancak tutarlılık tercihlerinizi iyi belirlemeli ve cache invalidation mekanizmalarını doğru kurgulamalısınız. Resmi dokümantasyonu takip ederek, Laravel 13 ve PHP 8.2+ ile uyumlu, güvenilir bir cache altyapısı oluşturabilirsiniz. Unutmayın: cache bir hızlandırıcıdır, veri kaynağı değildir.

Kaynaklar

🍪
Çerez Kullanımı

Kodumun Hatası, web sitesinin çalışmasını sağlamak ve kullanıcı deneyimini geliştirmek için çerezler kullanabilir. Zorunlu olmayan çerezler için tercihlerinizi belirleyebilir, ayrıntılı bilgiye Çerez Politikamızdan ulaşabilirsiniz.