Skip to content

Redis Kullanımı

Giriş

Redis (Remote Dictionary Server), açık kaynaklı, in-memory veri yapısı deposu olarak kullanılan bir NoSQL veritabanıdır. .NET uygulamalarında önbellekleme, oturum yönetimi, mesaj kuyruğu ve gerçek zamanlı analitik gibi çeşitli senaryolarda kullanılır.

Redis'in Önemi

  1. Performans
  2. Yüksek hızlı veri erişimi
  3. Düşük latency
  4. Yüksek throughput

  5. Ölçeklenebilirlik

  6. Yatay ölçeklenebilirlik
  7. Cluster desteği
  8. Replikasyon

  9. Esneklik

  10. Çoklu veri yapıları
  11. Zengin komut seti
  12. Genişletilebilir mimari

Redis Veri Tipleri

  1. String
  2. Metin ve sayısal değerler
  3. Binary-safe
  4. Atomic operasyonlar

  5. Hash

  6. Alan-değer çiftleri
  7. Nesne temsili
  8. Kısmi güncelleme

  9. List

  10. Sıralı koleksiyonlar
  11. Queue/Stack yapıları
  12. Blocking operasyonlar

  13. Set

  14. Benzersiz elemanlar
  15. Küme operasyonları
  16. Random eleman seçimi

  17. Sorted Set

  18. Sıralı benzersiz elemanlar
  19. Skor bazlı sıralama
  20. Range sorguları

Redis Kullanımı (.NET)

  1. Temel Kurulum

    // NuGet paketi: StackExchange.Redis
    public class RedisService
    {
        private readonly IConnectionMultiplexer _redis;
        private readonly ILogger<RedisService> _logger;
    
        public RedisService(IConnectionMultiplexer redis, ILogger<RedisService> logger)
        {
            _redis = redis;
            _logger = logger;
        }
    
        public async Task SetAsync<T>(string key, T value, TimeSpan? expiry = null)
        {
            var db = _redis.GetDatabase();
            var serializedValue = JsonSerializer.Serialize(value);
            await db.StringSetAsync(key, serializedValue, expiry);
        }
    
        public async Task<T> GetAsync<T>(string key)
        {
            var db = _redis.GetDatabase();
            var value = await db.StringGetAsync(key);
            return value.HasValue ? JsonSerializer.Deserialize<T>(value) : default;
        }
    }
    

  2. Hash Kullanımı

    public class RedisHashService
    {
        private readonly IConnectionMultiplexer _redis;
        private readonly ILogger<RedisHashService> _logger;
    
        public RedisHashService(IConnectionMultiplexer redis, ILogger<RedisHashService> logger)
        {
            _redis = redis;
            _logger = logger;
        }
    
        public async Task SetHashAsync<T>(string key, string field, T value)
        {
            var db = _redis.GetDatabase();
            var serializedValue = JsonSerializer.Serialize(value);
            await db.HashSetAsync(key, field, serializedValue);
        }
    
        public async Task<T> GetHashAsync<T>(string key, string field)
        {
            var db = _redis.GetDatabase();
            var value = await db.HashGetAsync(key, field);
            return value.HasValue ? JsonSerializer.Deserialize<T>(value) : default;
        }
    }
    

  3. List Kullanımı

    public class RedisListService
    {
        private readonly IConnectionMultiplexer _redis;
        private readonly ILogger<RedisListService> _logger;
    
        public RedisListService(IConnectionMultiplexer redis, ILogger<RedisListService> logger)
        {
            _redis = redis;
            _logger = logger;
        }
    
        public async Task PushAsync<T>(string key, T value)
        {
            var db = _redis.GetDatabase();
            var serializedValue = JsonSerializer.Serialize(value);
            await db.ListRightPushAsync(key, serializedValue);
        }
    
        public async Task<T> PopAsync<T>(string key)
        {
            var db = _redis.GetDatabase();
            var value = await db.ListLeftPopAsync(key);
            return value.HasValue ? JsonSerializer.Deserialize<T>(value) : default;
        }
    }
    

  4. Pub/Sub Kullanımı

    public class RedisPubSubService
    {
        private readonly IConnectionMultiplexer _redis;
        private readonly ILogger<RedisPubSubService> _logger;
    
        public RedisPubSubService(IConnectionMultiplexer redis, ILogger<RedisPubSubService> logger)
        {
            _redis = redis;
            _logger = logger;
        }
    
        public async Task PublishAsync<T>(string channel, T message)
        {
            var subscriber = _redis.GetSubscriber();
            var serializedMessage = JsonSerializer.Serialize(message);
            await subscriber.PublishAsync(channel, serializedMessage);
        }
    
        public void Subscribe<T>(string channel, Action<T> handler)
        {
            var subscriber = _redis.GetSubscriber();
            subscriber.Subscribe(channel, (redisChannel, message) =>
            {
                var deserializedMessage = JsonSerializer.Deserialize<T>(message);
                handler(deserializedMessage);
            });
        }
    }
    

Redis Best Practices

  1. Bağlantı Yönetimi
  2. Connection pooling
  3. Bağlantı multiplexing
  4. Timeout yönetimi
  5. Retry politikaları

  6. Veri Tasarımı

  7. Uygun veri tipleri
  8. Key naming conventions
  9. Veri boyutu optimizasyonu
  10. TTL kullanımı

  11. Performans

  12. Pipeline kullanımı
  13. Batch işlemler
  14. Memory optimizasyonu
  15. Monitoring

  16. Güvenlik

  17. Authentication
  18. SSL/TLS
  19. Network izolasyonu
  20. Access control

Redis Monitoring

  1. Redis CLI
  2. INFO komutu
  3. MONITOR komutu
  4. SLOWLOG komutu
  5. MEMORY komutu

  6. RedisInsight

  7. Real-time monitoring
  8. Performance metrics
  9. Memory analysis
  10. Key space analysis

  11. Prometheus + Grafana

  12. Custom metrics
  13. Alerting
  14. Dashboard
  15. Trend analysis

Mülakat Soruları

Temel Sorular

  1. Redis nedir ve ne için kullanılır?
  2. Cevap: Redis, in-memory veri yapısı deposu olarak kullanılan bir NoSQL veritabanıdır. Önbellekleme, oturum yönetimi, mesaj kuyruğu ve gerçek zamanlı analitik gibi senaryolarda kullanılır.

  3. Redis'in temel veri tipleri nelerdir?

  4. Cevap:

    • String
    • Hash
    • List
    • Set
    • Sorted Set
  5. Redis'in avantajları nelerdir?

  6. Cevap:

    • Yüksek performans
    • Ölçeklenebilirlik
    • Esneklik
    • Zengin veri tipleri
    • Atomic operasyonlar
  7. Redis'te persistence nasıl sağlanır?

  8. Cevap:

    • RDB (Redis Database)
    • AOF (Append Only File)
    • Hybrid yaklaşım
  9. Redis Cluster nedir?

  10. Cevap: Redis Cluster, verileri birden fazla Redis node'u arasında dağıtan ve yüksek kullanılabilirlik sağlayan bir yapıdır.

Teknik Sorular

  1. Redis'te string veri tipi nasıl kullanılır?
  2. Cevap:

    public class RedisStringService
    {
        private readonly IConnectionMultiplexer _redis;
        private readonly ILogger<RedisStringService> _logger;
    
        public RedisStringService(IConnectionMultiplexer redis, ILogger<RedisStringService> logger)
        {
            _redis = redis;
            _logger = logger;
        }
    
        public async Task SetAsync<T>(string key, T value, TimeSpan? expiry = null)
        {
            var db = _redis.GetDatabase();
            var serializedValue = JsonSerializer.Serialize(value);
            await db.StringSetAsync(key, serializedValue, expiry);
        }
    
        public async Task<T> GetAsync<T>(string key)
        {
            var db = _redis.GetDatabase();
            var value = await db.StringGetAsync(key);
            return value.HasValue ? JsonSerializer.Deserialize<T>(value) : default;
        }
    }
    

  3. Redis'te hash veri tipi nasıl kullanılır?

  4. Cevap:

    public class RedisHashService
    {
        private readonly IConnectionMultiplexer _redis;
        private readonly ILogger<RedisHashService> _logger;
    
        public RedisHashService(IConnectionMultiplexer redis, ILogger<RedisHashService> logger)
        {
            _redis = redis;
            _logger = logger;
        }
    
        public async Task SetHashAsync<T>(string key, string field, T value)
        {
            var db = _redis.GetDatabase();
            var serializedValue = JsonSerializer.Serialize(value);
            await db.HashSetAsync(key, field, serializedValue);
        }
    
        public async Task<T> GetHashAsync<T>(string key, string field)
        {
            var db = _redis.GetDatabase();
            var value = await db.HashGetAsync(key, field);
            return value.HasValue ? JsonSerializer.Deserialize<T>(value) : default;
        }
    }
    

  5. Redis'te pub/sub pattern nasıl implemente edilir?

  6. Cevap:

    public class RedisPubSubService
    {
        private readonly IConnectionMultiplexer _redis;
        private readonly ILogger<RedisPubSubService> _logger;
    
        public RedisPubSubService(IConnectionMultiplexer redis, ILogger<RedisPubSubService> logger)
        {
            _redis = redis;
            _logger = logger;
        }
    
        public async Task PublishAsync<T>(string channel, T message)
        {
            var subscriber = _redis.GetSubscriber();
            var serializedMessage = JsonSerializer.Serialize(message);
            await subscriber.PublishAsync(channel, serializedMessage);
        }
    
        public void Subscribe<T>(string channel, Action<T> handler)
        {
            var subscriber = _redis.GetSubscriber();
            subscriber.Subscribe(channel, (redisChannel, message) =>
            {
                var deserializedMessage = JsonSerializer.Deserialize<T>(message);
                handler(deserializedMessage);
            });
        }
    }
    

  7. Redis'te transaction nasıl kullanılır?

  8. Cevap:

    public class RedisTransactionService
    {
        private readonly IConnectionMultiplexer _redis;
        private readonly ILogger<RedisTransactionService> _logger;
    
        public RedisTransactionService(IConnectionMultiplexer redis, ILogger<RedisTransactionService> logger)
        {
            _redis = redis;
            _logger = logger;
        }
    
        public async Task<bool> ExecuteTransactionAsync(string key1, string key2, string value)
        {
            var db = _redis.GetDatabase();
            var tran = db.CreateTransaction();
    
            var set1 = tran.StringSetAsync(key1, value);
            var set2 = tran.StringSetAsync(key2, value);
    
            return await tran.ExecuteAsync();
        }
    }
    

  9. Redis'te pipeline nasıl kullanılır?

  10. Cevap:
    public class RedisPipelineService
    {
        private readonly IConnectionMultiplexer _redis;
        private readonly ILogger<RedisPipelineService> _logger;
    
        public RedisPipelineService(IConnectionMultiplexer redis, ILogger<RedisPipelineService> logger)
        {
            _redis = redis;
            _logger = logger;
        }
    
        public async Task<List<string>> ExecutePipelineAsync(List<string> keys)
        {
            var db = _redis.GetDatabase();
            var batch = db.CreateBatch();
            var tasks = new List<Task<RedisValue>>();
    
            foreach (var key in keys)
            {
                tasks.Add(batch.StringGetAsync(key));
            }
    
            batch.Execute();
            var results = await Task.WhenAll(tasks);
            return results.Select(r => r.ToString()).ToList();
        }
    }
    

İleri Seviye Sorular

  1. Redis Cluster'da veri nasıl dağıtılır?
  2. Cevap:

    • Hash slot dağıtımı
    • Consistent hashing
    • Replica sharding
    • Failover mekanizmaları
  3. Redis'te memory optimizasyonu nasıl yapılır?

  4. Cevap:

    • Memory profiling
    • Key compression
    • Data structure seçimi
    • Memory limits
    • Eviction politikaları
  5. Redis'te güvenlik nasıl sağlanır?

  6. Cevap:

    • Authentication
    • SSL/TLS
    • Network izolasyonu
    • Access control
    • Audit logging
  7. Redis'te monitoring ve alerting nasıl yapılır?

  8. Cevap:

    • Redis CLI
    • RedisInsight
    • Prometheus + Grafana
    • Custom metrics
    • Alerting rules
  9. Redis'te backup ve recovery nasıl yapılır?

  10. Cevap:
    • RDB backup
    • AOF backup
    • Point-in-time recovery
    • Disaster recovery
    • Replication