Back to Blog

Cache Invalidation Strategies

January 30, 20263 min
Caching StrategiesDistributed SystemsData ConsistencyRedis & Performance
Cache Invalidation Strategies

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

  1. Cache kontrol edilir (hit/miss).
  2. Cache hit → veri direkt döner.
  3. Cache miss → DB’den okunur.
  4. DB’den gelen veri cache’e yazılır.
  5. Kullanıcıya döner.
Client
  ↓
Cache (HIT?)
   │ yes → Return
   │
   no
   ↓
DB → Cache set → Return

Write Path

  1. DB güncellenir.
  2. 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ış

  1. Cache güncellenir.
  2. DB güncellenir.
  3. İ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ış

  1. Cache güncellenir.
  2. 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ı

ÖzellikCache-AsideWrite-ThroughWrite-Back
Okuma hızıÇok iyiÇok iyiÇok iyi
Yazma hızıİyiYavaşÇok hızlı
TutarlılıkEventualGüçlüEventual
RiskOrtaDüşükYüksek
Kullanım yaygınlığıÇok yaygınOrtaNiş

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.