TEMEL
Redis Databases (db0–db15)
Redis varsayılan olarak 16 ayrı database sunar (db0–db15). Her biri izole key namespace'idir. Cluster mode'da sadece db0 kullanılır.
Kod örneği görünümü
Bu sayfadaki eşleşen örnekleri seçilen istemciye göre gösterir.
# DB seçimi
SELECT 0 # varsayılan
SELECT 1 # farklı namespace
SELECT 15 # max
# Hangi DB'de kaç key var?
INFO keyspace
# db0:keys=1523,expires=120,avg_ttl=900000
# db1:keys=45,expires=45,avg_ttl=1800000
# DB temizle (sadece seçili DB)
FLUSHDB
# Tüm DB'leri temizle
FLUSHALL
# Key'i başka DB'ye taşı
MOVE mykey 2 # mykey → db2
# DB boyutu
DBSIZE
// ✅ DOĞRU: Tek Singleton multiplexer'dan farklı IDatabase al
public class MultiDbService
{
private readonly IDatabase _cacheDb; // db0 — genel cache
private readonly IDatabase _sessionDb; // db1 — session
private readonly IDatabase _queueDb; // db2 — queue/stream
public MultiDbService(IConnectionMultiplexer mux)
{
// GetDatabase(n) yeni TCP bağlantısı AÇMAZ.
// IDatabase lightweight struct'tır — GC pressure yok.
// Aynı multiplexed TCP connection üzerinden çalışır.
_cacheDb = mux.GetDatabase(0);
_sessionDb = mux.GetDatabase(1);
_queueDb = mux.GetDatabase(2);
}
public async Task<string?> GetCacheAsync(string key)
=> await _cacheDb.StringGetAsync(key);
public async Task SetSessionAsync(string sessionId, string data)
=> await _sessionDb.StringSetAsync($"session:{sessionId}", data, TimeSpan.FromMinutes(30));
public async Task EnqueueAsync(string message)
=> await _queueDb.ListLeftPushAsync("tasks", message);
}
// ❌ YANLIŞ: Her DB için ayrı ConnectionMultiplexer oluşturmak
// Bu pattern her instance için yeni TCP handshake + AUTH yapar:
// TCP 3-way handshake → TLS negotiation → AUTH → CLIENT SETNAME
// = ~3-15ms bağlantı maliyeti × N adet connection
// = server'da fazladan file descriptor, memory, keepalive
// = GC'de Large Object olarak ConnectionMultiplexer dispose problemi
// var cacheConn = ConnectionMultiplexer.Connect("redis:6379,defaultDatabase=0"); ❌
// var sessionConn = ConnectionMultiplexer.Connect("redis:6379,defaultDatabase=1"); ❌
// var queueConn = ConnectionMultiplexer.Connect("redis:6379,defaultDatabase=2"); ❌
// 3 ayrı TCP bağlantısı, 3× handshake, gereksiz resource tüketimi!
// Connection string ile varsayılan DB belirleme
var config = ConfigurationOptions.Parse("localhost:6379,defaultDatabase=1");
// IDistributedCache'e farklı DB atama
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost:6379,defaultDatabase=1";
options.InstanceName = "session:";
});
Kullanım Önerileri
| DB | Kullanım | Neden Ayrı DB |
|---|---|---|
| db0 | Genel cache (product, config) | Varsayılan, FLUSHDB güvenli |
| db1 | Session verileri | Bağımsız TTL/flush |
| db2 | Queue / Streams | İzole FLUSHDB |
| db3 | Rate limiting | Hızlı sıfırlama |
| db4–15 | Test / staging / geçici | Dev ortamında izolasyon |
Limitasyonlar — db0 dışı ne zaman KULLANILMAZ:
- Redis Cluster → Sadece db0 desteklenir. SELECT komutu hata verir.
- Redis Sentinel → Sentinel konfigürasyonu sadece db0'ı monitor eder. Failover sonrası diğer DB'ler garanti değildir.
- AWS ElastiCache / Azure Cache for Redis → Cluster mode aktifse sadece db0. Non-cluster modda db0–15 kullanılabilir.
- Master-Replica (read replica) → Tüm DB'ler replicate olur ama bazı cloud provider'lar kısıtlama koyar.
- Pub/Sub → Channel'lar DB'den bağımsızdır — db3'te PUBLISH yapsan da tüm subscriber'lar (herhangi db'de) alır.
- Tüm DB'ler aynı memory pool'u paylaşır — ayrı maxmemory atanamaz.
- Redis author Antirez: "Multiple DBs are a legacy feature, use namespaces instead."
SELECT Overhead & Performans:
GetDatabase(n)her komut öncesine SELECT n ekler (defaultDatabase dışındaki DB'ler için).- Bu ekstra komut: +1 roundtrip değil (pipeline'da gider) ama +14 byte bandwidth/komut.
- defaultDatabase ile eşleşen DB'ye
GetDatabase()çağrısında SELECT gönderilmez → sıfır overhead.- Sonuç: Yoğun trafikte (>100K ops/s) farklı DB kullanıyorsan, en çok kullanılan DB'yi
defaultDatabaseolarak ayarla.
Kural: Production'da Cluster/Sentinel/Cloud Redis kullanıyorsan her zaman db0 + key prefix ile çalış. Multi-DB kullanımı yalnızca standalone single-instance dev/test ortamında güvenlidir.
Öneri: Key prefix ile namespace:
cache:product:123,session:abc,queue:emails. Bu yaklaşım Cluster'a geçişte sıfır değişiklik gerektirir.