복붙노트

[REDIS] Stackexchange.Redis에 일괄 대 파이프 라이닝

REDIS

Stackexchange.Redis에 일괄 대 파이프 라이닝

나는 짧은 시간에 요소 수의 큰 (-ish) 번호를 삽입하려고하고 나는이 두 가지 대안을 시도했다 :

1) 파이프 라인 :

List<Task> addTasks = new List<Task>();
for (int i = 0; i < table.Rows.Count; i++)
{
    DataRow row = table.Rows[i];
    Task<bool> addAsync = redisDB.SetAddAsync(string.Format(keyFormat, row.Field<int>("Id")), row.Field<int>("Value"));
    addTasks.Add(addAsync);
}
Task[] tasks = addTasks.ToArray();
Task.WaitAll(tasks);

2) 배치 :

List<Task> addTasks = new List<Task>();
IBatch batch = redisDB.CreateBatch();
for (int i = 0; i < table.Rows.Count; i++)
{
    DataRow row = table.Rows[i];
    Task<bool> addAsync = batch.SetAddAsync(string.Format(keyFormat, row.Field<int>("Id")), row.Field<int>("Value"));
    addTasks.Add(addAsync);
}
batch.Execute();
Task[] tasks = addTasks.ToArray();
Task.WaitAll(tasks);

내가 어떤 상당한 시간 차이를 알아 차리지하고 있지 않다 (실제로 나는 배치 방법이 빠를 것으로 예상) : 약 250K 삽입을 위해 나는 배치에 대한 약 8 초 대 파이프 라이닝을 위해 약 7 초 얻을.

파이프 라인에있는 문서에서 읽기,

나에게,이는 A 배치 행동처럼 많이 들린다. 나는 뒤에서 때문에 나는 거의 TCP 같은 수의 두 버전에 전송 볼 procmon 간단한 검사에서 둘 사이에 어떤 큰 차이가 있는지 궁금합니다.

해결법

  1. ==============================

    1.내부적으로 SE.Redis 작업 꽤 그래서 귀하의 경우 매우 유사 것은 놀라운 일이 아니다, 피할 패킷 조각화 시도 않습니다. 배치 및 평면 파이프 라인의 주요 차이점은 다음과 같습니다 :

    내부적으로 SE.Redis 작업 꽤 그래서 귀하의 경우 매우 유사 것은 놀라운 일이 아니다, 피할 패킷 조각화 시도 않습니다. 배치 및 평면 파이프 라인의 주요 차이점은 다음과 같습니다 :

    SE.Redis가 자동으로 무엇을 간단하게 작업을 추가 할 때의 대부분을 달성하기 때문에 대부분의 경우, 배치를 피함으로써 더 잘 할 것입니다.

    최종 참고로; 로컬 오버 헤드를 피하기 위해 원하는 경우, 하나의 최종 접근 일 수 있습니다 :

    redisDB.SetAdd(string.Format(keyFormat, row.Field<int>("Id")),
        row.Field<int>("Value"), flags: CommandFlags.FireAndForget);
    

    이 둘의 응답을 기다리고이나 미래의 값을 나타내는 불완전 작업을 할당, 와이어 아래 모두를 보냅니다. 당신은 서버가 계속 당신에게 얘기를 확인하기 위해, 파이어 앤 포겟없이 마지막에 핑과 같은 작업을 수행 할 수 있습니다. 불이 앤 잊지 사용하는 것은 당신이보고받을 모든 서버 오류를 통지하지 않습니다 것을 의미하지 않습니다.

  2. from https://stackoverflow.com/questions/27796054/pipelining-vs-batching-in-stackexchange-redis by cc-by-sa and MIT license