Cache Invalidation Strategies
Cache Invalidation Nedir?
Cache invalidation, önbellekte tutulan verinin ne zaman ve nasıl geçersiz kılınacağını belirleme problemidir.
Temel problem şudur:
- Cache hızlıdır.
- Database doğru kaynaktır (source of truth).
- Database güncellendiğinde cache eski (stale) kalabilir.
- Eğer stale veri dönersek sistem yanlış çalışır.
Bu problem özellikle distributed sistemlerde zorlaşır çünkü:
- Cache birden fazla node’da olabilir.
- Concurrent request’ler aynı veriyi okuyup yazabilir.
- Race condition oluşabilir.
Bu yüzden cache invalidation, dağıtık sistemlerin en zor problemlerinden biridir.
Cache Stratejileri
1. Cache-Aside (Lazy Loading)
En yaygın kullanılan stratejidir.
Uygulama önce cache’e bakar. Eğer veri yoksa DB’den alır ve cache’e yazar.
Read Path
- Cache kontrol edilir (hit/miss).
- Cache hit → veri direkt döner.
- Cache miss → DB’den okunur.
- DB’den gelen veri cache’e yazılır.
- Kullanıcıya döner.
Client
↓
Cache (HIT?)
│ yes → Return
│
no
↓
DB → Cache set → Return
Write Path
- DB güncellenir.
- Cache key silinir (invalidate edilir).
await db.updateUser(id, data);
await redis.del(`user:${id}`);
Avantajları
- Bellek verimli kullanılır.
- Cache çökerse sistem durmaz (sadece yavaşlar).
- Uygulaması basittir.
Dezavantajları
- Stale data riski vardır.
- TTL kullanılmazsa cache kirlenebilir.
- Concurrent write’larda inconsistency oluşabilir.
Kod Örneği
const cacheKey = `user:${id}`;
let user = await redis.get(cacheKey);
if (!user) {
user = await db.getUser(id);
await redis.set(cacheKey, JSON.stringify(user), "EX", 60);
}
return user;
Bu strateji read-heavy sistemler için idealdir.
2. Write-Through
Bu stratejide veri yazılırken hem cache hem DB güncellenir.
Akış
- Cache güncellenir.
- DB güncellenir.
- İkisi de başarılıysa işlem tamamlanır.
Client
↓
Cache write
↓
DB write
Avantajları
- Cache ve DB senkron kalır.
- Okuma her zaman günceldir.
- Consistency daha güçlüdür.
Dezavantajları
- Write latency artar.
- Hiç okunmayacak veriler bile cache’e yazılır.
- Write-heavy sistemlerde pahalıdır.
await cache.set(key, value);
await db.write(value);
3. Write-Back (Write-Behind)
Veri önce cache’e yazılır, DB güncellemesi asenkron yapılır.
Akış
- Cache güncellenir.
- DB güncellemesi arka planda yapılır.
Avantaj:
- Yazma çok hızlıdır.
Risk:
- Cache çökerse veri kaybı olabilir.
- Eventual consistency vardır.
Genelde:
- Oyun skorları
- Logging
- High-throughput sistemler
Cache Invalidation Yöntemleri
1. Explicit Invalidation
Veri güncellendiğinde cache manuel silinir.
redis.del(key);
En güvenilir yöntemdir.
2. TTL (Time To Live)
Cache belirli süre sonra otomatik silinir.
EX 60
Avantaj:
- Kod karmaşıklığı azalır.
Dezavantaj:
- TTL süresince stale veri dönebilir.
Strateji Karşılaştırması
| Özellik | Cache-Aside | Write-Through | Write-Back |
|---|---|---|---|
| Okuma hızı | Çok iyi | Çok iyi | Çok iyi |
| Yazma hızı | İyi | Yavaş | Çok hızlı |
| Tutarlılık | Eventual | Güçlü | Eventual |
| Risk | Orta | Düşük | Yüksek |
| Kullanım yaygınlığı | Çok yaygın | Orta | Niş |
Hangi Senaryoda Hangisi?
| Senaryo | Önerilen Strateji |
|---|---|
| Çok fazla okuma, az yazma (blog, ürün listesi) | Cache-Aside |
| Kritik güncel veri (banka bakiyesi, finansal sistemler) | Write-Through |
| Yazma performansı kritik (oyun skorları, log sistemleri) | Write-Back |
Kritik Gerçek
Cache hiçbir zaman source of truth değildir. Source of truth her zaman database’tir.
Cache performans için vardır, doğruluk için değil.
Özet
- Cache invalidation, cache’deki eski veriyi doğru zamanda temizleme problemidir.
- Cache-Aside en yaygın ve pratik çözümdür.
- Write-Through daha güçlü consistency sağlar.
- Write-Back yüksek throughput için kullanılır.
- Distributed sistemlerde cache invalidation dikkatli tasarlanmalıdır.