Skip to content

Distributed Caching

Giriş

Distributed Caching, verilerin birden fazla sunucu arasında paylaşılan bir önbellek sisteminde saklanmasıdır. .NET'te Redis, NCache gibi dağıtık önbellek sistemleri kullanılarak uygulanabilir.

Distributed Caching'in Önemi

  1. Ölçeklenebilirlik
  2. Yatay ölçeklenebilirlik
  3. Yük dengeleme
  4. Yüksek erişilebilirlik

  5. Performans

  6. Düşük gecikme süreleri
  7. Yüksek verimlilik
  8. Ölçeklenebilir performans

  9. Güvenilirlik

  10. Fault tolerance
  11. Veri tutarlılığı
  12. Yüksek erişilebilirlik

Distributed Caching Türleri

  1. Redis
  2. Açık kaynak
  3. Yüksek performans
  4. Zengin veri tipleri
  5. Persistence desteği

  6. NCache

  7. .NET için optimize
  8. Yerel önbellek desteği
  9. Otomatik ölçekleme
  10. Yüksek güvenilirlik

  11. Memcached

  12. Basit ve hızlı
  13. Düşük bellek kullanımı
  14. Yüksek ölçeklenebilirlik
  15. Kolay entegrasyon

Distributed Caching Kullanımı

  1. Redis Kullanımı

    public class RedisCacheService
    {
        private readonly IConnectionMultiplexer _redis;
        private readonly IDatabase _database;
    
        public RedisCacheService(IConnectionMultiplexer redis)
        {
            _redis = redis;
            _database = redis.GetDatabase();
        }
    
        public async Task<T> GetOrCreateAsync<T>(string key, Func<Task<T>> factory, TimeSpan? expiry = null)
        {
            var value = await _database.StringGetAsync(key);
            if (!value.IsNull)
            {
                return JsonSerializer.Deserialize<T>(value);
            }
    
            var newValue = await factory();
            await _database.StringSetAsync(key, JsonSerializer.Serialize(newValue), expiry);
            return newValue;
        }
    }
    

  2. NCache Kullanımı

    public class NCacheService
    {
        private readonly ICache _cache;
    
        public NCacheService(ICache cache)
        {
            _cache = cache;
        }
    
        public T GetOrCreate<T>(string key, Func<T> factory, CacheItemPriority priority = CacheItemPriority.Default)
        {
            var item = _cache.Get<T>(key);
            if (item != null)
            {
                return item;
            }
    
            var newItem = factory();
            var cacheItem = new CacheItem(newItem)
            {
                Priority = priority
            };
            _cache.Insert(key, cacheItem);
            return newItem;
        }
    }
    

  3. Memcached Kullanımı

    public class MemcachedService
    {
        private readonly IMemcachedClient _client;
    
        public MemcachedService(IMemcachedClient client)
        {
            _client = client;
        }
    
        public async Task<T> GetOrCreateAsync<T>(string key, Func<Task<T>> factory, TimeSpan? expiry = null)
        {
            var value = await _client.GetAsync<T>(key);
            if (value != null)
            {
                return value;
            }
    
            var newValue = await factory();
            await _client.SetAsync(key, newValue, expiry ?? TimeSpan.FromMinutes(30));
            return newValue;
        }
    }
    

Distributed Caching Best Practices

  1. Veri Tasarımı
  2. Veri parçalama
  3. Veri sıkıştırma
  4. Veri serileştirme
  5. Veri boyutu optimizasyonu

  6. Ölçekleme Stratejileri

  7. Sharding
  8. Replication
  9. Partitioning
  10. Load balancing

  11. Güvenlik

  12. Şifreleme
  13. Erişim kontrolü
  14. Ağ güvenliği
  15. Veri izolasyonu

  16. Monitoring

  17. Performans metrikleri
  18. Sağlık kontrolleri
  19. Kapasite planlama
  20. Hata izleme

Mülakat Soruları

Temel Sorular

  1. Distributed Caching nedir ve neden önemlidir?
  2. Cevap: Distributed Caching, verilerin birden fazla sunucu arasında paylaşılan bir önbellek sisteminde saklanmasıdır. Ölçeklenebilirlik, performans ve güvenilirlik sağlar.

  3. Redis ve Memcached arasındaki farklar nelerdir?

  4. Cevap:

    • Redis: Zengin veri tipleri, persistence, atomic operasyonlar
    • Memcached: Basit, hızlı, düşük bellek kullanımı
  5. Cache coherency nedir ve nasıl sağlanır?

  6. Cevap:

    • Veri tutarlılığı
    • Replication stratejileri
    • Consistency modelleri
    • Conflict resolution
  7. Cache invalidation stratejileri nelerdir?

  8. Cevap:

    • Time-based
    • Event-based
    • Manual
    • Dependency-based
  9. Cache partitioning stratejileri nelerdir?

  10. Cevap:
    • Hash-based
    • Range-based
    • Directory-based
    • Consistent hashing

Teknik Sorular

  1. Redis ile distributed caching nasıl uygulanır?
  2. Cevap:

    public class RedisDistributedCache
    {
        private readonly IConnectionMultiplexer _redis;
        private readonly IDatabase _database;
    
        public RedisDistributedCache(IConnectionMultiplexer redis)
        {
            _redis = redis;
            _database = redis.GetDatabase();
        }
    
        public async Task<T> GetOrCreateAsync<T>(string key, Func<Task<T>> factory, TimeSpan? expiry = null)
        {
            var value = await _database.StringGetAsync(key);
            if (!value.IsNull)
            {
                return JsonSerializer.Deserialize<T>(value);
            }
    
            var newValue = await factory();
            await _database.StringSetAsync(key, JsonSerializer.Serialize(newValue), expiry);
            return newValue;
        }
    }
    

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

  4. Cevap:

    public class CacheMonitor
    {
        private readonly IConnectionMultiplexer _redis;
        private readonly ILogger<CacheMonitor> _logger;
    
        public CacheMonitor(IConnectionMultiplexer redis, ILogger<CacheMonitor> logger)
        {
            _redis = redis;
            _logger = logger;
        }
    
        public async Task LogCacheStatistics()
        {
            var server = _redis.GetServer(_redis.GetEndPoints().First());
            var info = await server.InfoAsync();
    
            var stats = new
            {
                ConnectedClients = info.FirstOrDefault(x => x.Key == "connected_clients")?.Value,
                UsedMemory = info.FirstOrDefault(x => x.Key == "used_memory")?.Value,
                TotalCommands = info.FirstOrDefault(x => x.Key == "total_commands_processed")?.Value
            };
    
            _logger.LogInformation("Cache Statistics: {@Stats}", stats);
        }
    }
    

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

  6. Cevap:

    public class CacheWithFallback
    {
        private readonly IDistributedCache _cache;
        private readonly ILogger<CacheWithFallback> _logger;
    
        public CacheWithFallback(IDistributedCache cache, ILogger<CacheWithFallback> logger)
        {
            _cache = cache;
            _logger = logger;
        }
    
        public async Task<T> GetWithFallback<T>(string key, Func<Task<T>> factory, TimeSpan cacheDuration)
        {
            try
            {
                var cachedValue = await _cache.GetStringAsync(key);
                if (cachedValue != null)
                {
                    return JsonSerializer.Deserialize<T>(cachedValue);
                }
    
                var value = await factory();
                await _cache.SetStringAsync(key, JsonSerializer.Serialize(value), new DistributedCacheEntryOptions
                {
                    AbsoluteExpirationRelativeToNow = cacheDuration
                });
                return value;
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Cache operation failed for key: {Key}", key);
                return await factory();
            }
        }
    }
    

  7. Cache size yönetimi nasıl yapılır?

  8. Cevap:

    public class CacheSizeManager
    {
        private readonly IConnectionMultiplexer _redis;
        private readonly ILogger<CacheSizeManager> _logger;
        private readonly long _maxSize;
    
        public CacheSizeManager(IConnectionMultiplexer redis, ILogger<CacheSizeManager> logger, long maxSize)
        {
            _redis = redis;
            _logger = logger;
            _maxSize = maxSize;
        }
    
        public async Task EnsureCacheSize()
        {
            var server = _redis.GetServer(_redis.GetEndPoints().First());
            var info = await server.InfoAsync();
            var usedMemory = long.Parse(info.First(x => x.Key == "used_memory").Value);
    
            if (usedMemory > _maxSize)
            {
                _logger.LogWarning("Cache size exceeded limit: {UsedMemory}/{MaxSize}", usedMemory, _maxSize);
                await EvictOldestItems();
            }
        }
    
        private async Task EvictOldestItems()
        {
            // Implement oldest items eviction logic
        }
    }
    

  9. Cache warming nasıl yapılır?

  10. Cevap:
    public class CacheWarmer
    {
        private readonly IDistributedCache _cache;
        private readonly ILogger<CacheWarmer> _logger;
    
        public CacheWarmer(IDistributedCache cache, ILogger<CacheWarmer> logger)
        {
            _cache = cache;
            _logger = logger;
        }
    
        public async Task WarmCache<T>(string key, Func<Task<T>> factory, TimeSpan cacheDuration)
        {
            try
            {
                var value = await factory();
                await _cache.SetStringAsync(key, JsonSerializer.Serialize(value), new DistributedCacheEntryOptions
                {
                    AbsoluteExpirationRelativeToNow = cacheDuration
                });
                _logger.LogInformation("Cache warmed for key: {Key}", key);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Failed to warm cache for key: {Key}", key);
            }
        }
    }
    

İleri Seviye Sorular

  1. Distributed locking nasıl uygulanır?
  2. Cevap:

    • Redis RedLock
    • ZooKeeper
    • Etcd
    • Consul
    • Custom distributed locks
  3. Cache coherency sorunları nasıl çözülür?

  4. Cevap:

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

  6. Cevap:

    • Hash-based
    • Range-based
    • Directory-based
    • Consistent hashing
    • Dynamic partitioning
  7. Cache monitoring ve alerting nasıl yapılır?

  8. Cevap:

    • Prometheus
    • Grafana
    • ELK Stack
    • Custom metrics
    • Alert rules
  9. Cache security nasıl sağlanır?

  10. Cevap:
    • TLS/SSL
    • Authentication
    • Authorization
    • Network isolation
    • Audit logging