복붙노트

[REDIS] StackExchange TimeoutException는 레디 스에서 2 개 세트에 750 개 항목을 삽입 할 때

REDIS

StackExchange TimeoutException는 레디 스에서 2 개 세트에 750 개 항목을 삽입 할 때

처음에 나는 (... 어쩌면이 모든 좋은 아이디어가 아니라) 2 개 레디 스 세트로 항목 중 일부 수집을 삽입하기 위해 노력하고있어. 나는 한 번에 추가하는 것을 시도하고 있다는 항목의 금액 : 750

StackExchange.redis 클라이언트를 사용하여이 작업을 수행 할 때 지금 내가 할 시간 제한 예외가 발생, 내가 사용 완료 유사한 행동을 할 수있어 그 흥미로운 점은 "기존"booksleeve 클라이언트는 내가 이전에 조사했습니다.

그래서, (심지어 어쩌면 내 intial bookSleeve 구현에) 뭔가 확실히 잘못, 그냥 정확히 무엇이 잘못되었는지 알아 내려고. 아래는 내가 레디 스 클라이언트를 사용하는 것이 코드의 샘플입니다 : BookSleeve :

using (var tran = connection.CreateTransaction())
{
Task lastOpTask = null;
tran.SuspendFlush();
try
{
    // perform required configurations/ actions
    tran.Sets.Add(_redisConfiguration.DbNumber, CurrentIdsSetDbKey, stringIds);
    tran.Sets.Add(_redisConfiguration.DbNumber, CurrentDetailsSetDbKey, stringDetails);
    lastOpTask = tran.Execute();
    isOperationSuccessful = true;
}
catch (TaskCanceledException ex)
{
    ...
}
catch (TimeoutException ex1)
{
    ...
}
finally
{
    tran.ResumeFlush();
}

if (lastOpTask != null)
{
    connection.Wait(lastOpTask);
    ...
}
}

동일한 코드의 StackExchange.redis 구현 :

var tran = db.CreateTransaction();

// todo: do we need to add here any condition or PipeLining? any watch/unwatch verifications?
tran.SetAddAsync(CurrentIdsSetDbKey, stringIds);
tran.SetAddAsync(CurrentDetailsSetDbKey, stringDetails);

try
{
    isOperationSuccessful = tran.Execute();
}
catch (TaskCanceledException ex)
{
    ...
}
catch (TimeoutException ex1)
{
    ...
}

내가 단위 테스트를 시작한 후 나는 StackExchange 클라이언트에 대한 다음 오류가 발생합니다 :

메시지 : 제한 시간 이달, EXEC 수행 : 3, 큐 3 숨어 0 = QS = 3, QC = 0, WR = 0 / 0

출처 : C에서 StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl [T] (메시지 메시지 ResultProcessor1 프로세서 ServerEndPoint 서버)에서 : \ 인 TeamCity \ buildAgent \ 작업 \ 18a91a3757cef937 \ StackExchange.Redis \ StackExchange \ 레디 스 \ ConnectionMultiplexer.cs : 1,693 라인    \ 인 TeamCity \ buildAgent \ 작업 \ 18a91a3757cef937 \ StackExchange.Redis \ StackExchange \ 레디 스 \ RedisBase.cs : 라인 92의 C StackExchange.Redis.RedisBase.ExecuteSync [T] (메시지 메시지 ResultProcessor1 프로세서 ServerEndPoint 서버)에서    StackExchange.Redis.RedisTransaction.Execute (CommandFlags 플래그) C에서의 : \ 인 TeamCity \ buildAgent \ 작업 \ 18a91a3757cef937 \ StackExchange.Redis \ StackExchange \ 레디 스 \ RedisTransaction.cs : 라인 (51)    \ 프로젝트 \ DFS \ 코드 \ DFS \ DFS.Cache.CacheManager.RedisStackExchange \ RedisContestCacheManager.cs : D에 DFS.Cache.CacheManager.RedisStackExchange.RedisContestCacheManager.RegisterAvailableContests (IList1 대회)에서 라인 (131)

그냥 정확히 내가 잘못을 뭘하는지 궁금해. 어떤 제안에 대해 미리 감사합니다!

추신 stackEchange.redis 구성을 위해 나는 GitHub의에서 마크에서 제공하는 설정 샘플 사용하고 (여기에서 사용할 수를 : StackExchange / StackExchange.Redis / 방울 / 마스터 / 문서 / Configuration.md)

추신 현재 StackExchange 클라이언트 구성 파일을 참조하십시오 :

var config = new ConfigurationOptions
{
    EndPoints =
        {
            {"MasterIP", 6379},
            {"SlaveIP", 6380}
        },
    CommandMap = CommandMap.Create(new HashSet<string>
        {
            // EXCLUDE a few commands (to work with data-flow-related mode only)
            "INFO",
            "CONFIG",
            "CLUSTER",
            "PING",
            "ECHO",
            "CLIENT"
        }, available: false),
    KeepAlive = 60, // 60 sec to ensure connection is alive
    ConnectTimeout = 5000, // 5 sec
    SyncTimeout = 5000, // 5 sec
    ServiceName = "mymaster", // sentinel service name
    DefaultVersion = new Version(2, 8, 8),
    Password = "password"
};

(세트에 사용되는) 표준 항목은 다음과 같습니다

{
    "Id":"08e5ffdbced046cb8f55c50e4bab822d",
    "Entries":0,
    "State":"i",
    "Name":"very dummy entry name value: autoGet 299",
    "Summary": "entry summary details, some long string 299, some common info, some data: true, 8200"
    "IsMultiple":true,
    "IsPublic":true,
    "MaxEntries":8200,
    "IsEntryVisible":true,
    "StartDate":"9/10/2014 12:00:00 AM"
}

추신 마크의 반응 후에 나는 시험의 몇 가지를 실행 및 단위 테스트에서 다른 오류를 가지고 예를 들면

{"Timeout performing SISMEMBER set:raw:Ids, inst: 1, queue: 6, qu=0, qs=6, qc=0, wr=0/0"} when set contains not more than 300 items. 

그래서 나는이 연결 문제와 StackExchange.redis 클라이언트에 현재의 스위치와는 아무 상관이 없다는 것을 동의합니다.

해결법

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

    1.다음은 잘 전달, 보고서는 로컬 10MS. 나는이 문제를 재현 대표적인 테스트를 할 수 있도록 빈칸을 조금 채울 수 있다면 나는 매우 관심이있을 것입니다. 참고 한때 0, QS = 3하는 시점에서 시간 초과, 우리가 응답 할 레디 스 서버 기다리고 있다는 것을 알려줍니다 = 것을. 물론 지역 대역폭과 지연 관심이 될 것이지만, 근본적으로, 그것을 작동합니다. 또한 동기화 - 제한 시간이 설정되어 무엇에 관심이있을 것입니다.

    다음은 잘 전달, 보고서는 로컬 10MS. 나는이 문제를 재현 대표적인 테스트를 할 수 있도록 빈칸을 조금 채울 수 있다면 나는 매우 관심이있을 것입니다. 참고 한때 0, QS = 3하는 시점에서 시간 초과, 우리가 응답 할 레디 스 서버 기다리고 있다는 것을 알려줍니다 = 것을. 물론 지역 대역폭과 지연 관심이 될 것이지만, 근본적으로, 그것을 작동합니다. 또한 동기화 - 제한 시간이 설정되어 무엇에 관심이있을 것입니다.

    using System.Diagnostics;
    using System.Linq;
    using NUnit.Framework;
    
    namespace StackExchange.Redis.Tests.Issues
    {
        [TestFixture]
        public class SO22786599 : TestBase
        {
            [Test]
            public void Execute()
            {
                string CurrentIdsSetDbKey = Me() + ".x";
                string CurrentDetailsSetDbKey = Me() + ".y";
    
                RedisValue[] stringIds = Enumerable.Range(1, 750).Select(i => (RedisValue)(i + " id")).ToArray();
                RedisValue[] stringDetails = Enumerable.Range(1, 750).Select(i => (RedisValue)(i + " detail")).ToArray();
    
                using (var conn = Create())
                {
                    var db = conn.GetDatabase();
                    var tran = db.CreateTransaction();
    
                    tran.SetAddAsync(CurrentIdsSetDbKey, stringIds);
                    tran.SetAddAsync(CurrentDetailsSetDbKey, stringDetails);
    
                    var watch = Stopwatch.StartNew();
                    var isOperationSuccessful = tran.Execute();
                    watch.Stop();
                    System.Console.WriteLine("{0}ms", watch.ElapsedMilliseconds);
                    Assert.IsTrue(isOperationSuccessful);                
                }
            }
        }
    }
    
  2. from https://stackoverflow.com/questions/22786599/stackexchange-timeoutexception-when-trying-to-insert-750-items-in-2-sets-in-redi by cc-by-sa and MIT license