Bir API'nin en çok ziyaret edilen ama nadiren değişen verilerini her istekte veritabanından çekmek, gereksiz bir maliyet. Redis'i bu tür projelerde dağıtık önbellek (distributed cache) olarak kullanmaya başladığımdan beri, hem yanıt sürelerinde hem veritabanı yükünde ciddi iyileşme görüyorum.
Ne Zaman Önbelleğe Almalı?
Her veriyi önbelleğe almak bir çözüm değil, yeni bir problem kaynağı. Sık okunan, seyrek değişen veriler (ürün kategorileri, konfigürasyon değerleri, sık sorulan istatistikler) önbellekleme için ideal adaylar. Sık değişen, kullanıcıya özel hassas veriler için önbellekleme riskli olabiliyor.
Cache-Aside Deseni
En çok kullandığım yaklaşım cache-aside: önce Redis'e bakıyorum, veri yoksa veritabanından çekip Redis'e yazıyorum.
var cached = await _cache.GetStringAsync(key);
if (cached is not null)
return JsonSerializer.Deserialize<Product>(cached);
var product = await _db.Products.FindAsync(id);
await _cache.SetStringAsync(key, JsonSerializer.Serialize(product),
new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10) });
return product;
Cache Invalidation: En Zor Kısım
"Bilgisayar biliminde iki zor şey vardır: cache invalidation ve isimlendirme" sözü boşuna söylenmemiş. Bir veri güncellendiğinde ilgili cache anahtarını da temizlemeyi unutmak, kullanıcıya eski veri göstermeye devam etmeme sebep oluyor. Bu yüzden her yazma (write) işleminde, ilgili cache anahtarlarını da açıkça geçersiz kılıyorum.
Kısa TTL, Uzun Baş Ağrısından İyidir
Cache invalidation'ı her senaryoda kusursuz yönetmek yerine, çoğu veri için makul bir TTL (time-to-live, örn. 5-15 dakika) belirlemek, basit ve sağlam bir güvenlik ağı sağlıyor. Mükemmel invalidation mantığı kurmaya çalışıp karmaşıklığı artırmaktansa, kısa süreli "biraz bayat veri" riskini kabul etmeyi tercih ediyorum.
Sonuç
Redis, doğru kullanıldığında bir API'nin performansını dramatik şekilde artırabiliyor. Ama her güçlü araç gibi, ne zaman ve nasıl kullanılacağını anlamadan eklemek, basit bir performans sorununu daha karmaşık bir tutarlılık sorununa çevirebiliyor.