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.
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.