복붙노트

[REDIS] 파이프 라인 명령에 대한 응답을 비활성화 레디 스 수 있습니까?

REDIS

파이프 라인 명령에 대한 응답을 비활성화 레디 스 수 있습니까?

나는 현재의 요구는 이런 모든 통화에 대해 몇 백 개 카운터를 증가 캐시를 개발하고 있어요 :

redis.pipelined do
  keys.each{ |key| redis.incr key }
end

내이 내가 할 대답은하지 여전히 레디 스 보석에 의해 수집 및 일부 우아하고 교통이 시간을 낭비하는 필요 지금 톱을 프로파일 링합니다. 나는 답장에 관심이 아니에요 어떤 방법으로 레디 스를 말할 수 있습니까? 값의 증가를 많이하는 더 좋은 방법이 있나요.

나는 예를 들어, MINCR 명령을 찾을 수 없습니다 ..

사전에 감사합니다!

해결법

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

    1.예 ... 2.6에서, 적어도. 당신은 LUA 스크립트에서이 작업을 수행하고, 단순히 LUA 스크립트가 빈 결과를 반환있을 수 있습니다. 여기에는 booksleeve 클라이언트를 사용하고 있습니다 :

    예 ... 2.6에서, 적어도. 당신은 LUA 스크립트에서이 작업을 수행하고, 단순히 LUA 스크립트가 빈 결과를 반환있을 수 있습니다. 여기에는 booksleeve 클라이언트를 사용하고 있습니다 :

    const int DB = 0; // any database number
    // prime some initial values
    conn.Keys.Remove(DB, new[] {"a", "b", "c"});
    conn.Strings.Increment(DB, "b");
    conn.Strings.Increment(DB, "c");
    conn.Strings.Increment(DB, "c");
    
    // run the script, passing "a", "b", "c", "c" to
    // increment a & b by 1, c twice
    var result = conn.Scripting.Eval(DB,
        @"for i,key in ipairs(KEYS) do redis.call('incr', key) end",
        new[] { "a", "b", "c", "c"}, // <== aka "KEYS" in the script
        null); // <== aka "ARGV" in the script
    
    // check the incremented values
    var a = conn.Strings.GetInt64(DB, "a");
    var b = conn.Strings.GetInt64(DB, "b");
    var c = conn.Strings.GetInt64(DB, "c");
    
    Assert.IsNull(conn.Wait(result), "result");
    Assert.AreEqual(1, conn.Wait(a), "a");
    Assert.AreEqual(2, conn.Wait(b), "b");
    Assert.AreEqual(4, conn.Wait(c), "c");
    

    또는 인수로 숫자 "에 의해"를 전달 incrby과 같은 일을 중간 부분을 변경합니다 :

    // run the script, passing "a", "b", "c" and 1, 1, 2
    // increment a & b by 1, c twice
    var result = conn.Scripting.Eval(DB,
        @"for i,key in ipairs(KEYS) do redis.call('incrby', key, ARGV[i]) end",
        new[] { "a", "b", "c" }, // <== aka "KEYS" in the script
        new object[] { 1, 1, 2 }); // <== aka "ARGV" in the script
    
  2. ==============================

    2.아니, 이건 수 없습니다. 응답하지 레디 스를 알 수있는 방법은 없습니다.

    아니, 이건 수 없습니다. 응답하지 레디 스를 알 수있는 방법은 없습니다.

    몇 가지 포인트에서 응답을 위해 기적을 기다리고 피할 수있는 유일한 방법은 (Node.js를 또는 비동기 모드에서 hiredis 등) 완전히 비동기 클라이언트를 실행하는 것입니다.

  3. ==============================

    3.레디 스의 버전 3.2은 명시 적으로 지원합니다 :

    레디 스의 버전 3.2은 명시 적으로 지원합니다 :

    https://redis.io/commands/client-reply

    클라이언트 REPLY 명령 제어 서버는 클라이언트의 명령을 응답할지 여부를 지정합니다. 다음 모드를 사용할 수 있습니다 : 의 위에. 이 서버가 모든 명령에 대한 응답을 반환하는 기본 모드입니다. 떨어져서. 이 모드에서 서버는 클라이언트의 명령에 응답하지 않습니다. 건너 뛰기. 이 모드는 즉시 후 명령의 응답을 건너 뜁니다.

    반환 값 하나 OFF 또는 SKIP 하위 명령을 호출 할 때, 아무 응답이 이루어지지 않습니다. ON 호출하는 경우 : 단순 문자열 응답 : OK.

  4. from https://stackoverflow.com/questions/13025165/can-redis-disable-the-replies-for-pipelined-commands by cc-by-sa and MIT license