Gereksinimler ve Ön Hazırlık
Bir önbellekleme katmanı kurmadan önce, doğru araçları seçmek ve ortamı hazırlamak kritiktir. 2026 yılı itibarıyla endüstri standardı olan Redis, anahtar-değer (key-value) tabanlı yapısıyla en hızlı çözümdür.
- Redis Sunucusu: Verilerin geçici olarak tutulacağı bellek içi veritabanı.
- SQL Veritabanı: PostgreSQL veya MySQL gibi kalıcı depolama birimi.
- Dil Desteği: Bu rehberde örnekler için modern PHP ve Redis istemcisi kullanılacaktır.
- Bağlantı Kütüphanesi:
phpredisveyaprediseklentilerinin yüklü olması gerekir.
Adım 1: Veritabanı Sorgusunu Önbelleğe Alma Mantığı
Önbellekleme katmanının temel mantığı, veritabanına gitmeden önce "bu veri daha önce istendi mi?" sorusunu sormaktır. Eğer veri Redis içinde varsa doğrudan oradan döndürülür; yoksa veritabanından çekilir ve bir sonraki sefer için Redis'e yazılır.
// Temel önbellek kontrol mantığı
$cacheKey = "kullanici_profil_" . $userId;
$cachedData = $redis->get($cacheKey);
if ($cachedData) {
// Redis'ten gelen veriyi çöz ve döndür
return json_decode($cachedData, true);
} else {
// Veritabanından veriyi çek
$userData = $db->query("SELECT * FROM users WHERE id = ?", [$userId]);
// Redis'e 3600 saniye (1 saat) süreyle kaydet
$redis->setex($cacheKey, 3600, json_encode($userData));
return $userData;
}
Bu kodda setex fonksiyonu kullanılır. Bu fonksiyon, veriyi kaydederken aynı zamanda bir yaşam süresi (TTL - Time To Live) atar. Bu, belleğin dolmasını engellemek için hayati bir adımdır.
Adım 2: Önbellek Geçersizleştirme (Cache Invalidation) Stratejileri
En büyük hata, veritabanında bir güncelleme yapıldığında önbelleğin eski veriyi göstermeye devam etmesidir. Veri güncellendiğinde, ilgili önbellek anahtarını silmek veya güncellemek gerekir.
// Veri güncelleme ve önbellek temizleme
function updateKullanici($userId, $newData) {
global $db, $redis;
// 1. Veritabanını güncelle (SQL Injection korumalı)
$stmt = $db->prepare("UPDATE users SET name = ? WHERE id = ?");
$stmt->execute([$newData['name'], $userId]);
// 2. İlgili önbelleği sil
$redis->del("kullanici_profil_" . $userId);
}
Bu yaklaşımda, veritabanı güncellendiği anda önbelleği sileriz. Böylece bir sonraki istekte sistem otomatik olarak güncel veriyi veritabanından çeker ve tekrar önbelleğe alır.
Adım 3: Performans Karşılaştırma Tablosu
Önbellekleme yöntemlerinin veritabanı üzerindeki etkisini anlamak için aşağıdaki tabloyu inceleyebilirsiniz.
| Yöntem | Yanıt Süresi | Veritabanı Yükü | Karmaşıklık |
|---|---|---|---|
| Doğrudan SQL Sorgusu | Yavaş (50-200ms) | Yüksek | Düşük |
| Redis Önbellekleme | Çok Hızlı (1-5ms) | Çok Düşük | Orta |
Adım 4: Güvenli Veri Serileştirme
Verileri Redis'e kaydederken JSON formatını kullanmak, farklı diller arasında uyumluluk sağlar. Ancak, verilerin güvenliği için serileştirme sırasında dikkatli olunmalıdır.
// Veriyi güvenli bir şekilde JSON'a çevirme
$data = ['id' => 1, 'email' => 'test@example.com'];
$serializedData = json_encode($data, JSON_THROW_ON_ERROR);
// Redis'e kaydet
$redis->set('user:1', $serializedData);
JSON_THROW_ON_ERROR bayrağı, hatalı bir veri yapısı durumunda uygulamanın sessizce başarısız olmasını engeller ve hatayı yakalamanıza olanak tanır.
Adım 5: Cache Aside (Kenara Bırakma) Deseni Uygulaması
Cache Aside, en yaygın kullanılan önbellekleme desenidir. Uygulama, veriyi önce önbellekte arar, bulamazsa veritabanına gider ve sonucu önbelleğe yazar.
class Repository {
public function getById($id) {
$key = "item:" . $id;
$data = $this->redis->get($key);
if (!$data) {
$data = $this->db->fetch("SELECT * FROM items WHERE id = ?", [$id]);
$this->redis->setex($key, 300, json_encode($data));
}
return json_decode($data, true);
}
}
Bu desen, veritabanı üzerindeki "okuma" baskısını ciddi oranda azaltır. 300 saniyelik süre, verinin tazeliği ile performans dengesi gözetilerek seçilmelidir.
Kritik Uyarı: Önbellekleme katmanında asla hassas verileri (şifreler, kredi kartı bilgileri, kişisel kimlik verileri) düz metin olarak saklamayın. Eğer saklamanız gerekiyorsa, verileri Redis'e göndermeden önce mutlaka şifreleyin (Encryption at rest).
Sıkça Sorulan Sorular
Önbellek süresi (TTL) nasıl belirlenir?
Verinin ne kadar sıklıkla değiştiğine bağlıdır. Çok sık değişen veriler için kısa (örn: 60 saniye), nadir değişen veriler için uzun (örn: 24 saat) süreler tercih edilmelidir.
Redis çökerse uygulama ne olur?
İyi tasarlanmış bir katman, Redis'e ulaşılamadığında hatayı yakalamalı ve doğrudan veritabanına yönlendirme yapmalıdır. Uygulamanız Redis bağımlı olmamalıdır.
Cache Stampede nedir?
Aynı anda süresi dolan binlerce önbellek anahtarının veritabanına aynı anda yüklenmesidir. Bunu önlemek için TTL sürelerini rastgele (jitter) dağıtmalısınız.
Hangi veriler önbelleğe alınmamalıdır?
Gerçek zamanlı borsa verileri, anlık bildirimler veya her kullanıcı için tamamen benzersiz olan oturum verileri önbelleğe almak için uygun olmayabilir.
Bellek dolarsa ne olur?
Redis'in maxmemory-policy ayarını kullanarak, bellek dolduğunda en az kullanılan verilerin (LRU - Least Recently Used) silinmesini sağlayabilirsiniz.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka birim testleri yapın ve bağlantı hatalarını (Exception Handling) yönetin. Veritabanı güvenliği için her zaman PDO veya hazır ORM yapılarını kullanarak SQL Injection saldırılarına karşı önlem alın.
İleri Düzey Önbellekleme: "Write-Through" Stratejisi ve Uygulaması
Cache Aside deseninin aksine, Write-Through stratejisi veritabanı ile önbelleğin her zaman senkronize kalmasını sağlar. Bu yöntemde, uygulama veriyi doğrudan veritabanına yazmak yerine önce önbelleğe yazar, ardından önbellek sağlayıcısı veriyi veritabanına işler. Bu, verinin tutarlılığını garanti altına alsa da yazma işlemlerinde hafif bir gecikmeye neden olabilir.
Aşağıdaki örnekte, veritabanı güncelleme işlemini bir sarmalayıcı (wrapper) fonksiyon ile nasıl yöneteceğinizi görebilirsiniz:
function updateDataWithWriteThrough($key, $data, $dbConnection, $redis) {
// 1. Önce veritabanını güncelle
$stmt = $dbConnection->prepare("UPDATE products SET price = ? WHERE id = ?");
$stmt->execute([$data['price'], $data['id']]);
// 2. Ardından önbelleği güncelle (Invalidate yerine doğrudan güncelleme)
$redis->set($key, json_encode($data));
return true;
}
Önbellekleme Katmanında Hata Ayıklama ve İzleme (Monitoring)
Önbellek katmanınızın sağlıklı çalışıp çalışmadığını anlamak için "Cache Hit/Miss" oranlarını takip etmek kritiktir. Eğer Cache Miss oranınız çok yüksekse, önbellek anahtarlarınız (keys) çok sık değişiyor veya TTL süreleriniz çok kısa olabilir.
Redis İzleme İpuçları
- INFO komutu: Redis sunucusunun anlık bellek kullanımını ve bağlantı sayısını görmek için
redis-cli INFOkomutunu kullanın. - Slowlog:
SLOWLOG GET 10komutu ile önbellek katmanında yavaş çalışan sorguları tespit edin. - Monitor: Canlı trafiği izlemek için
MONITORkomutunu kullanın (ancak üretim ortamında dikkatli olun, ciddi yük bindirebilir).
Hata ayıklama sürecinde, uygulamanızın önbellek katmanından veri çekemediği durumlarda veritabanına yüklenmesini engellemek için bir Circuit Breaker (Devre Kesici) mekanizması kurmanız önerilir. Eğer Redis bağlantısı koparsa, uygulama doğrudan veritabanına yönlenmeli ancak veritabanını korumak için sorgu limitleri (rate limiting) uygulanmalıdır.
try {
$data = $redis->get($cacheKey);
} catch (RedisException $e) {
error_log("Redis bağlantısı koptu: " . $e->getMessage());
// Redis yoksa doğrudan veritabanından çek
$data = fetchFromDatabase($id);
}
Bu yaklaşım, sisteminizin "fail-safe" (hata anında güvenli) çalışmasını sağlar ve önbellek sunucusunun geçici kesintilerinde uygulamanızın tamamen çökmesini engeller.
Sonuç
SQL & veritabanı ile uygulamalar için veri önbellekleme katmanı kurmak, ölçeklenebilir sistemlerin temel taşıdır. Redis kullanarak veritabanı yükünü azaltmak, uygulamanızın kullanıcı deneyimini doğrudan iyileştirir. Bu rehberde öğrendiğiniz "Cache Aside" deseni ve önbellek geçersizleştirme teknikleri, profesyonel projelerinizde kullanabileceğiniz en sağlam yöntemlerdir.
Bir sonraki adım olarak, Redis'i bir dağıtık sistemde (cluster) nasıl yapılandıracağınızı ve "Write-Through" önbellekleme desenini araştırarak mimarinizi bir üst seviyeye taşıyabilirsiniz.


Yorumlar (0)
Yorum Yaz