복붙노트

[REDIS] 푸른 레디 스 캐시 - 여러 오류 TimeoutException : 제한 시간이 GET을 수행 {키}

REDIS

푸른 레디 스 캐시 - 여러 오류 TimeoutException : 제한 시간이 GET을 수행 {키}

우리는 푸른 우리의 응용 프로그램을 배포했습니다. 그것은 푸른 레디 스 캐시를 사용하고 우리는 꽤 많은 시간 제한을 경험하고 있습니다. 즉:

[TimeoutException: Timeout performing GET textobjectDetails__23290_TextObject, inst: 1, mgr: Inactive, queue: 5, qu=0, qs=5, qc=0, wr=0/0, in=56864/0]

[TimeoutException: Timeout performing GET featured_series_CachedSeries, inst: 1, mgr: Inactive, queue: 4, qu=0, qs=4, qc=0, wr=0/0, in=44470/0]

[TimeoutException: Timeout performing GET SeriesByFranchiseId_1_CachedSeries, inst: 1, mgr: Inactive, queue: 3, qu=0, qs=3, qc=0, wr=0/0, in=11252/0]

[TimeoutException: Timeout performing GET media_silo-1-1-0_Media, inst: 1, mgr: Inactive, queue: 3, qu=0, qs=3, qc=0, wr=0/0, in=15188/0]

[TimeoutException: Timeout performing GET textobjectDetails__3092_TextObject, inst: 3, mgr: Inactive, queue: 7, qu=0, qs=7, qc=0, wr=0/0, in=65536/0]

[TimeoutException: Timeout performing GET textobjectbytype_104__TextObject, inst: 11, mgr: Inactive, queue: 9, qu=0, qs=9, qc=0, wr=0/0, in=65536/0]

[TimeoutException: Timeout performing GET groupnews_2_14_TextObject, inst: 1, mgr: Inactive, queue: 7, qu=0, qs=7, qc=0, wr=0/0, in=65536/0]

[TimeoutException: Timeout performing GET archived_news_by_group_13586_1_TextObject, inst: 2, mgr: Inactive, queue: 7, qu=0, qs=7, qc=0, wr=0/0, in=65536/0]

[TimeoutException: Timeout performing GET textobjectDetails__24404_TextObject, inst: 11, mgr: Inactive, queue: 12, qu=0, qs=12, qc=0, wr=0/0, in=65536/0]

[TimeoutException: Timeout performing GET standings_232_lcds_fixtures, inst: 2, mgr: Inactive, queue: 11, qu=0, qs=11, qc=0, wr=0/0, in=65536/0]

[TimeoutException: Timeout performing GET player_name1099_Player, inst: 4, mgr: Inactive, queue: 11, qu=0, qs=11, qc=0, wr=0/0, in=65536/0]

[TimeoutException: Timeout performing GET groupnews_1_6_TextObject, inst: 4, mgr: Inactive, queue: 9, qu=0, qs=9, qc=0, wr=0/0, in=65536/0]

[TimeoutException: Timeout performing GET archivednewscount__20789_TextObject, inst: 2, mgr: Inactive, queue: 11, qu=0, qs=11, qc=0, wr=0/0, in=65536/0]

[TimeoutException: Timeout performing GET media_id3648_Media, inst: 1, mgr: Inactive, queue: 10, qu=0, qs=10, qc=0, wr=0/0, in=65536/0]

예외의 몸은 그들 모두에 대해 동일합니다 :

StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor`1 processor, ServerEndPoint server):509
    StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor`1 processor, ServerEndPoint server):25
    StackExchange.Redis.RedisDatabase.StringGet(RedisKey key, CommandFlags flags):16
    AB.SiteCaching.Providers.RedisDataSource+<>c__DisplayClasse`1.<RetrieveCacheObject>b__b():0
    Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func):115
    AB.SiteCaching.Providers.RedisDataSource.RetrieveCacheObject[T](String fullCacheKey):56
    AB.SiteCaching.Providers.RedisDataSource.RetrieveCached[T](String key, Func`1 onNotCached, TimeSpan timeOut):61
    DataAccess.Data.Caching.CachedSeries.GetSeriesByFranchiseId(Int32 franchiseId):64
    Shared.Services.SeriesService.LatestYearByFranchiseId(Int32 franchiseId):0
    AllBlacksdotcom.Controllers.FixturesController._MostRecentYearOfFixtures(Int32 franchiseId):0
    (unknown).lambda_method(Closure , ControllerBase , Object[] ):-1
    System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters):0
    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters):87
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters):0
    System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState):0
    System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult):0
    System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResultBase`1.End():41
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult):0
    System.Web.Mvc.Async.AsyncControllerActionInvoker+AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d():20
    System.Web.Mvc.Async.AsyncControllerActionInvoker+AsyncInvocationWithFilters+<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f():134
    System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult):0
    System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult):0
    System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResultBase`1.End():41
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult):0
    System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass21+<>c__DisplayClass2b.<BeginInvokeAction>b__1c():0
    System.Web.Mvc.Async.AsyncControllerActionInvoker+<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult):65
    System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult):0
    System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResultBase`1.End():41
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult):0
    System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState):0
    System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult):0
    System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResultBase`1.End():41
    System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult):0
    System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller):0
    System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult):0
    System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResultBase`1.End():41
    System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult):0
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult):0
    System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState):0
    System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult):0
    System.Web.Mvc.Async.AsyncResultWrapper+WrappedAsyncResultBase`1.End():41
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult):0
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result):0
    System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper+<>c__DisplayClassa.<EndProcessRequest>b__9():0
    System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerWrapper+<>c__DisplayClass4.<Wrap>b__3():0
    System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerWrapper.Wrap[TResult](Func`1 func):0
    System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerWrapper.Wrap(Action action):25
    System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper.EndProcessRequest(IAsyncResult result):32
    System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride):772

우리의 시간 제한 설정을 참조하십시오 :

retryTimeoutInMilliseconds = "5000" 
connectionTimeoutInMilliseconds = "5000" 
operationTimeoutInMilliseconds = "1000" 

어떻게이 시간 초과 접근합니까? 겠습니까 증가 operationTimeoutInMilliseconds 트릭을 할? I는 g-ZIP 압축은 레디 스로부터 데이터를 판독하는 데 걸리는 시간을 감소하는데 도움이되는 읽어.

레디 스 관련된 모든 nuget 패키지는 최신 버전입니다. 우리는 푸른 레디 스 캐시의 C1 버전 사용 (C2 도움말을 증가하는 것을?).

해결법

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

    1.우리의 상황을 개선 몇 가지 포인트 :

    우리의 상황을 개선 몇 가지 포인트 :

    대신 된 BinaryFormatter의 Protobuf-NET

    나는 당신이 당신의 캐시에 저장하려는이 값의 크기를 줄일 수로 protobuf - 그물을 사용하는 것이 좋습니다.

    public interface ICacheDataSerializer
        {
            byte[] Serialize(object o);
            T Deserialize<T>(byte[] stream);
        }
    
    public class ProtobufNetSerializer : ICacheDataSerializer
        {
            public byte[] Serialize(object o)
            {
                using (var memoryStream = new MemoryStream())
                {
                    Serializer.Serialize(memoryStream, o);
    
                    return memoryStream.ToArray();
                }
            }
    
            public T Deserialize<T>(byte[] stream)
            {
                var memoryStream = new MemoryStream(stream);
    
                return Serializer.Deserialize<T>(memoryStream);
            }
        }
    

    재시도 전략을 구현

    핸들 시간 제한 문제에 대한이 RedisCacheTransientErrorDetectionStrategy를 구현합니다.

    using Microsoft.Practices.TransientFaultHandling;
    
    public class RedisCacheTransientErrorDetectionStrategy : ITransientErrorDetectionStrategy
        {
            /// <summary>
            /// Custom Redis Transient Error Detenction Strategy must have been implemented to satisfy Redis exceptions.
            /// </summary>
            /// <param name="ex"></param>
            /// <returns></returns>
            public bool IsTransient(Exception ex)
            {
                if (ex == null) return false;
    
                if (ex is TimeoutException) return true;
    
                if (ex is RedisServerException) return true;
    
                if (ex is RedisException) return true;
    
                if (ex.InnerException != null)
                {
                    return IsTransient(ex.InnerException);
                }
    
                return false;
            }
        }
    

    다음과 같이 인스턴스화 :

    private readonly RetryPolicy _retryPolicy;
    
    // CODE
    var retryStrategy = new FixedInterval(3, TimeSpan.FromSeconds(2));
                _retryPolicy = new RetryPolicy<RedisCacheTransientErrorDetectionStrategy>(retryStrategy);
    

    다음과 같이 사용합니다 :

    var cachedString = _retryPolicy.ExecuteAction(() => dataCache.StringGet(fullCacheKey));
    

    당신이 당신의 캐시에 저장하는 캐시 호출과 값을 최소화하기 위해 코드를 검토합니다. 좀 더 효율적으로 값을 저장함으로써 에러가 많이 감소시켰다.

    이 중 어느 것도 할 수없는 경우. 높은 캐시로 이동 (우리는 대신 C1의 C3를 사용하여 종료).

  2. ==============================

    2.귀하의 예외 메시지를 모두에서, 당신은 "에서 = 65536 / 0"같은 있습니다. 이는 65,536 바이트 (로컬 시스템 커널 소켓 버퍼에) 국부적으로 수신되었지만 아직 StackExchange.Redis 처리되지 않았 음을 나타낸다. 이것은 당신의 응답을 처리에서 시스템을 유지하고 사물의 클라이언트 응용 프로그램 측에서 문제를 가리 것이다. 이 발생할 수 있습니다 내가 그 생각할 수있는 두 가지 가능성 :

    귀하의 예외 메시지를 모두에서, 당신은 "에서 = 65536 / 0"같은 있습니다. 이는 65,536 바이트 (로컬 시스템 커널 소켓 버퍼에) 국부적으로 수신되었지만 아직 StackExchange.Redis 처리되지 않았 음을 나타낸다. 이것은 당신의 응답을 처리에서 시스템을 유지하고 사물의 클라이언트 응용 프로그램 측에서 문제를 가리 것이다. 이 발생할 수 있습니다 내가 그 생각할 수있는 두 가지 가능성 :

    어쨌든,이 도움이되기를 바랍니다.

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

    3.푸른로 이동하여 더 큰 레디 스 인스턴스를 얻을. 그 t

    푸른로 이동하여 더 큰 레디 스 인스턴스를 얻을. 그 t

  4. from https://stackoverflow.com/questions/29569997/azure-redis-cache-multiple-errors-timeoutexception-timeout-performing-get-ke by cc-by-sa and MIT license