Skip to content

Cache Invalidation

Giriş

Cache Invalidation, önbellekteki verilerin geçerliliğini yitirdiğinde veya güncellendiğinde, bu verilerin önbellekten kaldırılması veya güncellenmesi işlemidir. Doğru cache invalidation stratejileri, veri tutarlılığını sağlamak için kritik öneme sahiptir.

Cache Invalidation'in Önemi

  1. Veri Tutarlılığı
  2. Güncel veri sağlama
  3. Stale data önleme
  4. Veri senkronizasyonu

  5. Performans

  6. Gereksiz önbellek kullanımını önleme
  7. Bellek optimizasyonu
  8. Sistem kaynaklarının verimli kullanımı

  9. Güvenilirlik

  10. Doğru veri sağlama
  11. Hata önleme
  12. Sistem stabilitesi

Cache Invalidation Stratejileri

  1. Time-Based Invalidation
  2. Absolute expiration
  3. Sliding expiration
  4. Hybrid expiration

  5. Event-Based Invalidation

  6. Veri değişikliği
  7. Sistem olayları
  8. Kullanıcı aksiyonları

  9. Dependency-Based Invalidation

  10. Veri bağımlılıkları
  11. İlişkisel veriler
  12. Cascade invalidation

  13. Manual Invalidation

  14. Kullanıcı tetiklemeli
  15. Admin kontrollü
  16. Sistem yönetimi

Cache Invalidation Kullanımı

  1. Time-Based Invalidation

    public class TimeBasedCache
    {
        private readonly IMemoryCache _cache;
        private readonly ILogger<TimeBasedCache> _logger;
    
        public TimeBasedCache(IMemoryCache cache, ILogger<TimeBasedCache> logger)
        {
            _cache = cache;
            _logger = logger;
        }
    
        public void SetWithExpiration<T>(string key, T value, TimeSpan expiration)
        {
            var options = new MemoryCacheEntryOptions()
                .SetAbsoluteExpiration(expiration)
                .RegisterPostEvictionCallback((key, value, reason, state) =>
                {
                    _logger.LogInformation("Cache entry {Key} was evicted due to {Reason}", key, reason);
                });
    
            _cache.Set(key, value, options);
        }
    }
    

  2. Event-Based Invalidation

    public class EventBasedCache
    {
        private readonly IMemoryCache _cache;
        private readonly ILogger<EventBasedCache> _logger;
    
        public EventBasedCache(IMemoryCache cache, ILogger<EventBasedCache> logger)
        {
            _cache = cache;
            _logger = logger;
        }
    
        public void InvalidateOnEvent(string key, IObservable<object> eventStream)
        {
            eventStream.Subscribe(_ =>
            {
                _cache.Remove(key);
                _logger.LogInformation("Cache entry {Key} was invalidated due to event", key);
            });
        }
    }
    

  3. Dependency-Based Invalidation

    public class DependencyBasedCache
    {
        private readonly IMemoryCache _cache;
        private readonly ILogger<DependencyBasedCache> _logger;
    
        public DependencyBasedCache(IMemoryCache cache, ILogger<DependencyBasedCache> logger)
        {
            _cache = cache;
            _logger = logger;
        }
    
        public void InvalidateDependencies(string key, IEnumerable<string> dependencies)
        {
            foreach (var dependency in dependencies)
            {
                _cache.Remove(dependency);
                _logger.LogInformation("Cache entry {Dependency} was invalidated due to dependency on {Key}", dependency, key);
            }
        }
    }
    

  4. Manual Invalidation

    public class ManualCacheInvalidator
    {
        private readonly IMemoryCache _cache;
        private readonly ILogger<ManualCacheInvalidator> _logger;
    
        public ManualCacheInvalidator(IMemoryCache cache, ILogger<ManualCacheInvalidator> logger)
        {
            _cache = cache;
            _logger = logger;
        }
    
        public void Invalidate(string key)
        {
            _cache.Remove(key);
            _logger.LogInformation("Cache entry {Key} was manually invalidated", key);
        }
    
        public void InvalidateByPattern(string pattern)
        {
            var keys = GetKeysByPattern(pattern);
            foreach (var key in keys)
            {
                Invalidate(key);
            }
        }
    }
    

Cache Invalidation Best Practices

  1. Strateji Seçimi
  2. Veri türüne göre strateji
  3. Kullanım senaryosuna göre strateji
  4. Performans gereksinimlerine göre strateji

  5. Monitoring

  6. Invalidation oranları
  7. Cache hit/miss oranları
  8. Performans metrikleri
  9. Hata izleme

  10. Error Handling

  11. Graceful degradation
  12. Fallback mekanizmaları
  13. Retry politikaları
  14. Logging

  15. Performance

  16. Batch invalidation
  17. Asenkron invalidation
  18. Lazy invalidation
  19. Optimize edilmiş algoritmalar

Mülakat Soruları

Temel Sorular

  1. Cache Invalidation nedir ve neden önemlidir?
  2. Cevap: Cache Invalidation, önbellekteki verilerin geçerliliğini yitirdiğinde veya güncellendiğinde, bu verilerin önbellekten kaldırılması veya güncellenmesi işlemidir. Veri tutarlılığı, performans ve güvenilirlik için kritik öneme sahiptir.

  3. Farklı cache invalidation stratejileri nelerdir?

  4. Cevap:

    • Time-Based
    • Event-Based
    • Dependency-Based
    • Manual
  5. Cache coherency nedir?

  6. Cevap:

    • Veri tutarlılığı
    • Senkronizasyon
    • Consistency modelleri
    • Conflict resolution
  7. Stale data nedir ve nasıl önlenir?

  8. Cevap:

    • Eski veri
    • Invalidation stratejileri
    • TTL kullanımı
    • Versioning
  9. Cache warming nedir?

  10. Cevap:
    • Önceden yükleme
    • Performans optimizasyonu
    • Cold start önleme
    • Kullanım senaryoları

Teknik Sorular

  1. Time-based cache invalidation nasıl uygulanır?
  2. Cevap:

    public class TimeBasedInvalidation
    {
        private readonly IMemoryCache _cache;
        private readonly ILogger<TimeBasedInvalidation> _logger;
    
        public TimeBasedInvalidation(IMemoryCache cache, ILogger<TimeBasedInvalidation> logger)
        {
            _cache = cache;
            _logger = logger;
        }
    
        public void SetWithExpiration<T>(string key, T value, TimeSpan expiration)
        {
            var options = new MemoryCacheEntryOptions()
                .SetAbsoluteExpiration(expiration)
                .RegisterPostEvictionCallback((key, value, reason, state) =>
                {
                    _logger.LogInformation("Cache entry {Key} was evicted due to {Reason}", key, reason);
                });
    
            _cache.Set(key, value, options);
        }
    }
    

  3. Event-based cache invalidation nasıl uygulanır?

  4. Cevap:

    public class EventBasedInvalidation
    {
        private readonly IMemoryCache _cache;
        private readonly ILogger<EventBasedInvalidation> _logger;
    
        public EventBasedInvalidation(IMemoryCache cache, ILogger<EventBasedInvalidation> logger)
        {
            _cache = cache;
            _logger = logger;
        }
    
        public void InvalidateOnEvent(string key, IObservable<object> eventStream)
        {
            eventStream.Subscribe(_ =>
            {
                _cache.Remove(key);
                _logger.LogInformation("Cache entry {Key} was invalidated due to event", key);
            });
        }
    }
    

  5. Dependency-based cache invalidation nasıl uygulanır?

  6. Cevap:

    public class DependencyBasedInvalidation
    {
        private readonly IMemoryCache _cache;
        private readonly ILogger<DependencyBasedInvalidation> _logger;
    
        public DependencyBasedInvalidation(IMemoryCache cache, ILogger<DependencyBasedInvalidation> logger)
        {
            _cache = cache;
            _logger = logger;
        }
    
        public void InvalidateDependencies(string key, IEnumerable<string> dependencies)
        {
            foreach (var dependency in dependencies)
            {
                _cache.Remove(dependency);
                _logger.LogInformation("Cache entry {Dependency} was invalidated due to dependency on {Key}", dependency, key);
            }
        }
    }
    

  7. Cache monitoring nasıl yapılır?

  8. Cevap:

    public class CacheMonitor
    {
        private readonly IMemoryCache _cache;
        private readonly ILogger<CacheMonitor> _logger;
    
        public CacheMonitor(IMemoryCache cache, ILogger<CacheMonitor> logger)
        {
            _cache = cache;
            _logger = logger;
        }
    
        public void LogCacheStatistics()
        {
            var stats = new
            {
                HitCount = _cache.GetCurrentStatistics()?.TotalHits ?? 0,
                MissCount = _cache.GetCurrentStatistics()?.TotalMisses ?? 0,
                CurrentSize = _cache.GetCurrentStatistics()?.CurrentEntryCount ?? 0
            };
    
            _logger.LogInformation("Cache Statistics: {@Stats}", stats);
        }
    }
    

  9. Cache fallback stratejisi nasıl uygulanır?

  10. Cevap:
    public class CacheWithFallback
    {
        private readonly IMemoryCache _cache;
        private readonly ILogger<CacheWithFallback> _logger;
    
        public CacheWithFallback(IMemoryCache cache, ILogger<CacheWithFallback> logger)
        {
            _cache = cache;
            _logger = logger;
        }
    
        public async Task<T> GetWithFallback<T>(string key, Func<Task<T>> factory, TimeSpan cacheDuration)
        {
            try
            {
                if (_cache.TryGetValue(key, out T cachedValue))
                {
                    return cachedValue;
                }
    
                var value = await factory();
                _cache.Set(key, value, cacheDuration);
                return value;
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Cache operation failed for key: {Key}", key);
                return await factory();
            }
        }
    }
    

İleri Seviye Sorular

  1. Distributed cache invalidation nasıl yapılır?
  2. Cevap:

    • Pub/Sub pattern
    • Event sourcing
    • Message queues
    • Distributed locks
    • Consensus algorithms
  3. Cache coherency sorunları nasıl çözülür?

  4. Cevap:

    • Strong consistency
    • Eventual consistency
    • Read-your-writes
    • Monotonic reads
    • Consistent prefix
  5. Cache warming stratejileri nelerdir?

  6. Cevap:

    • Startup warming
    • Background warming
    • Predictive warming
    • Scheduled warming
    • On-demand warming
  7. Cache monitoring ve alerting nasıl yapılır?

  8. Cevap:

    • Performance metrics
    • Hit/miss ratios
    • Memory usage
    • Latency monitoring
    • Custom alerts
  9. Cache security nasıl sağlanır?

  10. Cevap:
    • Encryption
    • Access control
    • Data isolation
    • Secure communication
    • Audit logging