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¶
- Performans
- Yüksek hızlı veri erişimi
- Düşük latency
-
Yüksek throughput
-
Ölçeklenebilirlik
- Yatay ölçeklenebilirlik
- Cluster desteği
-
Replikasyon
-
Esneklik
- Çoklu veri yapıları
- Zengin komut seti
- Genişletilebilir mimari
Redis Veri Tipleri¶
- String
- Metin ve sayısal değerler
- Binary-safe
-
Atomic operasyonlar
-
Hash
- Alan-değer çiftleri
- Nesne temsili
-
Kısmi güncelleme
-
List
- Sıralı koleksiyonlar
- Queue/Stack yapıları
-
Blocking operasyonlar
-
Set
- Benzersiz elemanlar
- Küme operasyonları
-
Random eleman seçimi
-
Sorted Set
- Sıralı benzersiz elemanlar
- Skor bazlı sıralama
- Range sorguları
Redis Kullanımı (.NET)¶
-
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; } }
-
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; } }
-
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; } }
-
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¶
- Bağlantı Yönetimi
- Connection pooling
- Bağlantı multiplexing
- Timeout yönetimi
-
Retry politikaları
-
Veri Tasarımı
- Uygun veri tipleri
- Key naming conventions
- Veri boyutu optimizasyonu
-
TTL kullanımı
-
Performans
- Pipeline kullanımı
- Batch işlemler
- Memory optimizasyonu
-
Monitoring
-
Güvenlik
- Authentication
- SSL/TLS
- Network izolasyonu
- Access control
Redis Monitoring¶
- Redis CLI
- INFO komutu
- MONITOR komutu
- SLOWLOG komutu
-
MEMORY komutu
-
RedisInsight
- Real-time monitoring
- Performance metrics
- Memory analysis
-
Key space analysis
-
Prometheus + Grafana
- Custom metrics
- Alerting
- Dashboard
- Trend analysis
Mülakat Soruları¶
Temel Sorular¶
- Redis nedir ve ne için kullanılır?
-
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.
-
Redis'in temel veri tipleri nelerdir?
-
Cevap:
- String
- Hash
- List
- Set
- Sorted Set
-
Redis'in avantajları nelerdir?
-
Cevap:
- Yüksek performans
- Ölçeklenebilirlik
- Esneklik
- Zengin veri tipleri
- Atomic operasyonlar
-
Redis'te persistence nasıl sağlanır?
-
Cevap:
- RDB (Redis Database)
- AOF (Append Only File)
- Hybrid yaklaşım
-
Redis Cluster nedir?
- 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¶
- Redis'te string veri tipi nasıl kullanılır?
-
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; } }
-
Redis'te hash veri tipi nasıl kullanılır?
-
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; } }
-
Redis'te pub/sub pattern nasıl implemente edilir?
-
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); }); } }
-
Redis'te transaction nasıl kullanılır?
-
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(); } }
-
Redis'te pipeline nasıl kullanılır?
- 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¶
- Redis Cluster'da veri nasıl dağıtılır?
-
Cevap:
- Hash slot dağıtımı
- Consistent hashing
- Replica sharding
- Failover mekanizmaları
-
Redis'te memory optimizasyonu nasıl yapılır?
-
Cevap:
- Memory profiling
- Key compression
- Data structure seçimi
- Memory limits
- Eviction politikaları
-
Redis'te güvenlik nasıl sağlanır?
-
Cevap:
- Authentication
- SSL/TLS
- Network izolasyonu
- Access control
- Audit logging
-
Redis'te monitoring ve alerting nasıl yapılır?
-
Cevap:
- Redis CLI
- RedisInsight
- Prometheus + Grafana
- Custom metrics
- Alerting rules
-
Redis'te backup ve recovery nasıl yapılır?
- Cevap:
- RDB backup
- AOF backup
- Point-in-time recovery
- Disaster recovery
- Replication