RRedis Handbook

İLERİ

Pipeline & Batch

Birden fazla komutu tek roundtrip'te gönder. Latency dramatik düşer.

Kod örneği görünümü Bu sayfadaki eşleşen örnekleri seçilen istemciye göre gösterir.
❌ Sequential — 6 roundtrip CMD1 CMD2 CMD3 CMD4 CMD5 CMD6 Her komut ayrı gönderilir → beklenir → sonraki gönderilir (6 × RTT) ✅ Pipeline — 1 roundtrip CMD1 + CMD2 + CMD3 + CMD4 + CMD5 + CMD6 → bulk send Tüm komutlar tek seferde gönderilir → tek response alınır (1 × RTT) 100 komut: 50ms seq vs 0.5ms pipe
# redis-cli pipe mode
echo -e "SET a 1\nSET b 2\nSET c 3\nGET a\nGET b\nGET c" | redis-cli --pipe

# Normal: 6 komut = 6 roundtrip
# Pipeline: 6 komut = 1 roundtrip
public class BatchService
{
    private readonly IDatabase _redis;

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

    // Batch (fire-and-forget + await sonuçları)
    public async Task<Dictionary<string, string?>> BatchGetAsync(IEnumerable<string> keys)
    {
        var batch = _redis.CreateBatch();
        var tasks = keys.ToDictionary(
            k => k,
            k => batch.StringGetAsync(k));
        batch.Execute();

        var results = new Dictionary<string, string?>();
        foreach (var (key, task) in tasks)
        {
            var value = await task;
            results[key] = value.HasValue ? value.ToString() : null;
        }
        return results;
    }

    // Pipeline ile bulk write
    public async Task BulkSetAsync(Dictionary<string, string> data, TimeSpan ttl)
    {
        var batch = _redis.CreateBatch();
        var tasks = new List<Task>();

        foreach (var (key, value) in data)
        {
            tasks.Add(batch.StringSetAsync(key, value, ttl));
        }

        batch.Execute();
        await Task.WhenAll(tasks);
    }

    // FireAndForget (sonucu beklemeden)
    public void IncrementNoWait(string key)
    {
        _redis.StringIncrement(key, flags: CommandFlags.FireAndForget);
    }
}

StackExchange.Redis zaten multiplexed. Ayrı thread'lerden gelen komutlar otomatik pipeline'lanır. CreateBatch explicit kontrol istersen kullan — genellikle gerek yok.