Skip to content

Caching Stratejileri

Giriş

Caching (önbellekleme), uygulama performansını artırmak için sık kullanılan verilerin geçici olarak saklanması işlemidir. .NET uygulamalarında farklı caching stratejileri ve yaklaşımları bulunmaktadır.

Caching'in Önemi

  1. Performans İyileştirmesi
  2. Veritabanı yükünü azaltma
  3. Yanıt sürelerini kısaltma
  4. Sistem kaynaklarını verimli kullanma

  5. Ölçeklenebilirlik

  6. Yük dengeleme
  7. Sistem yükünü dağıtma
  8. Kaynak kullanımını optimize etme

  9. Maliyet Optimizasyonu

  10. Veritabanı maliyetlerini azaltma
  11. Bant genişliği kullanımını optimize etme
  12. İşlem maliyetlerini düşürme

Caching Türleri

  1. In-Memory Caching
  2. Uygulama içi önbellekleme
  3. Distributed Cache
  4. Memory Cache

  5. Distributed Caching

  6. Redis
  7. NCache
  8. Memcached

  9. Response Caching

  10. HTTP Response Caching
  11. Output Caching
  12. Response Compression

  13. Database Caching

  14. Query Result Caching
  15. Stored Procedure Caching
  16. Materialized Views

Caching Stratejileri

  1. Cache-Aside
  2. Veri isteğe bağlı olarak önbelleğe alınır
  3. Uygulama önbelleği yönetir
  4. Esnek ve kontrol edilebilir

  5. Read-Through

  6. Önbellek veritabanından okur
  7. Uygulama önbelleğe erişir
  8. Şeffaf ve basit

  9. Write-Through

  10. Veri hem önbelleğe hem veritabanına yazılır
  11. Veri tutarlılığı sağlar
  12. Performans maliyeti vardır

  13. Write-Behind

  14. Veri önce önbelleğe yazılır
  15. Veritabanına asenkron yazılır
  16. Yüksek performans sağlar

Caching Best Practices

  1. Cache Key Tasarımı
  2. Anlamlı ve tutarlı isimlendirme
  3. Versiyonlama
  4. Namespace kullanımı

  5. Cache Invalidation

  6. Zaman tabanlı
  7. Olay tabanlı
  8. Manuel invalidation

  9. Cache Size Yönetimi

  10. Memory limitleri
  11. Eviction politikaları
  12. Monitoring

  13. Error Handling

  14. Fallback mekanizmaları
  15. Circuit breaker
  16. Retry politikaları

Mülakat Soruları

Temel Sorular

  1. Caching nedir ve neden önemlidir?
  2. Cevap: Caching, sık kullanılan verilerin geçici olarak saklanması işlemidir. Performans iyileştirmesi, ölçeklenebilirlik ve maliyet optimizasyonu sağlar.

  3. In-Memory ve Distributed Caching arasındaki farklar nelerdir?

  4. Cevap:

    • In-Memory: Tek sunucuda, hızlı, uygulama içi
    • Distributed: Birden fazla sunucuda, ölçeklenebilir, paylaşımlı
  5. Cache invalidation stratejileri nelerdir?

  6. Cevap:

    • Zaman tabanlı (TTL)
    • Olay tabanlı
    • Manuel invalidation
    • Dependency-based
  7. Cache-aside pattern nedir?

  8. Cevap:

    • Veri isteğe bağlı önbelleğe alınır
    • Uygulama önbelleği yönetir
    • Esnek ve kontrol edilebilir
    • Yaygın kullanılan pattern
  9. Cache coherency nedir?

  10. Cevap:
    • Önbellek tutarlılığı
    • Veri senkronizasyonu
    • Stale data önleme
    • Consistency modelleri

Teknik Sorular

  1. MemoryCache kullanımı nasıl yapılır?
  2. Cevap:

    public class CacheService
    {
        private readonly IMemoryCache _cache;
        private readonly MemoryCacheEntryOptions _options;
    
        public CacheService(IMemoryCache cache)
        {
            _cache = cache;
            _options = new MemoryCacheEntryOptions()
                .SetSlidingExpiration(TimeSpan.FromMinutes(30))
                .SetAbsoluteExpiration(TimeSpan.FromHours(1));
        }
    
        public T GetOrCreate<T>(string key, Func<T> factory)
        {
            return _cache.GetOrCreate(key, entry =>
            {
                entry.SetOptions(_options);
                return factory();
            });
        }
    }
    

  3. Distributed Cache kullanımı nasıl yapılır?

  4. Cevap:

    public class DistributedCacheService
    {
        private readonly IDistributedCache _cache;
        private readonly DistributedCacheEntryOptions _options;
    
        public DistributedCacheService(IDistributedCache cache)
        {
            _cache = cache;
            _options = new DistributedCacheEntryOptions
            {
                AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1),
                SlidingExpiration = TimeSpan.FromMinutes(30)
            };
        }
    
        public async Task<T> GetOrCreateAsync<T>(string key, Func<Task<T>> factory)
        {
            var cached = await _cache.GetAsync(key);
            if (cached != null)
            {
                return JsonSerializer.Deserialize<T>(cached);
            }
    
            var result = await factory();
            await _cache.SetAsync(key, JsonSerializer.SerializeToUtf8Bytes(result), _options);
            return result;
        }
    }
    

  5. Cache invalidation nasıl yapılır?

  6. Cevap:

    public class CacheInvalidator
    {
        private readonly IMemoryCache _cache;
        private readonly ILogger<CacheInvalidator> _logger;
    
        public CacheInvalidator(IMemoryCache cache, ILogger<CacheInvalidator> logger)
        {
            _cache = cache;
            _logger = logger;
        }
    
        public void Invalidate(string key)
        {
            _cache.Remove(key);
            _logger.LogInformation("Cache invalidated for key: {Key}", key);
        }
    
        public void InvalidateByPattern(string pattern)
        {
            var keys = GetKeysByPattern(pattern);
            foreach (var key in keys)
            {
                Invalidate(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. Cache coherency sorunları nasıl çözülür?
  2. Cevap:

    • Strong consistency modelleri
    • Eventual consistency
    • Versioning
    • Distributed locking
    • Cache synchronization
  3. Cache warming stratejileri nelerdir?

  4. Cevap:

    • Startup warming
    • Background warming
    • Predictive warming
    • Scheduled warming
    • On-demand warming
  5. Cache partitioning nasıl yapılır?

  6. Cevap:

    • Key-based partitioning
    • Hash-based partitioning
    • Range partitioning
    • Directory partitioning
    • Consistent hashing
  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