RRedis Handbook

İLERİ

Cluster Mode

16384 hash slot → node'lara dağıtılır. Horizontal scaling. Her node bir kısım slot'tan sorumlu.

Kod örneği görünümü Bu sayfadaki eşleşen örnekleri seçilen istemciye göre gösterir.
Client GET user:42 Node A (Master) slots 0-5460 Node B (Master) slots 5461-10922 Node C (Master) slots 10923-16383 -MOVED 12539 nodeC:6379 CRC16("user:42") mod 16384 = 12539 → slot 12539 → Node C sorumlu StackExchange.Redis otomatik yönlendirir MOVED redirect Doğru yönlendirme
# 6 node cluster (3 master + 3 replica)
redis-cli --cluster create \
  redis-1:6379 redis-2:6379 redis-3:6379 \
  redis-4:6379 redis-5:6379 redis-6:6379 \
  --cluster-replicas 1

# Cluster durumu
redis-cli CLUSTER INFO
redis-cli CLUSTER NODES
redis-cli CLUSTER SLOTS

# Key hangi slot'ta?
redis-cli CLUSTER KEYSLOT "user:1001"

# Hash tag — aynı slot'a düşür
SET {user:1001}:profile "..."
SET {user:1001}:settings "..."
# {user:1001} kısmı slot hesaplanır → multi-key ops mümkün
// Cluster bağlantısı
var config = new ConfigurationOptions
{
    AbortOnConnectFail = false,
    ConnectRetry = 5,
    ConnectTimeout = 10000,
    Password = "clusterpass"
};
// Tüm node'ları ekle (discovery otomatik çalışır ama seed gerekli)
config.EndPoints.Add("redis-1:6379");
config.EndPoints.Add("redis-2:6379");
config.EndPoints.Add("redis-3:6379");

builder.Services.AddSingleton<IConnectionMultiplexer>(
    ConnectionMultiplexer.Connect(config));

// Hash tag ile multi-key operasyonlar
public class UserClusterService
{
    private readonly IDatabase _redis;

    public UserClusterService(IConnectionMultiplexer mux)
        => _redis = mux.GetDatabase();

    // Hash tag: {user:1001} → aynı slot
    public async Task SetUserDataAsync(int userId, UserProfile profile, UserSettings settings)
    {
        var batch = _redis.CreateBatch();

        // Aynı hash tag → aynı slot → transaction mümkün
        _ = batch.StringSetAsync($"{{user:{userId}}}:profile",
            JsonSerializer.Serialize(profile), TimeSpan.FromHours(1));
        _ = batch.StringSetAsync($"{{user:{userId}}}:settings",
            JsonSerializer.Serialize(settings), TimeSpan.FromHours(1));

        batch.Execute();
    }

    // Multi-key SCAN (cluster'da her node'a gider)
    public async Task<List<string>> ScanKeysAsync(string pattern, int count = 100)
    {
        var server = _redis.Multiplexer.GetServers();
        var keys = new List<string>();

        foreach (var srv in server)
        {
            await foreach (var key in srv.KeysAsync(pattern: pattern, pageSize: count))
            {
                keys.Add(key.ToString());
            }
        }
        return keys;
    }
}

Cluster'da KEYS, SCAN, FLUSHALL tüm node'lara gider. MGET/MSET farklı slot'lardaki key'lere çalışmaz → hash tag kullan: {user:1001}:field.

Cluster + SELECT: Redis Cluster'da sadece db0 kullanılabilir. SELECT 1 komutu ERR SELECT is not allowed in cluster mode hatası verir. Mevcut multi-DB kullanan uygulamayı Cluster'a taşıyorsan tüm DB ayrımını key prefix'e çevirmelisin.