[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.우리의 상황을 개선 몇 가지 포인트 :
우리의 상황을 개선 몇 가지 포인트 :
대신 된 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.귀하의 예외 메시지를 모두에서, 당신은 "에서 = 65536 / 0"같은 있습니다. 이는 65,536 바이트 (로컬 시스템 커널 소켓 버퍼에) 국부적으로 수신되었지만 아직 StackExchange.Redis 처리되지 않았 음을 나타낸다. 이것은 당신의 응답을 처리에서 시스템을 유지하고 사물의 클라이언트 응용 프로그램 측에서 문제를 가리 것이다. 이 발생할 수 있습니다 내가 그 생각할 수있는 두 가지 가능성 :
귀하의 예외 메시지를 모두에서, 당신은 "에서 = 65536 / 0"같은 있습니다. 이는 65,536 바이트 (로컬 시스템 커널 소켓 버퍼에) 국부적으로 수신되었지만 아직 StackExchange.Redis 처리되지 않았 음을 나타낸다. 이것은 당신의 응답을 처리에서 시스템을 유지하고 사물의 클라이언트 응용 프로그램 측에서 문제를 가리 것이다. 이 발생할 수 있습니다 내가 그 생각할 수있는 두 가지 가능성 :
어쨌든,이 도움이되기를 바랍니다.
-
==============================
3.푸른로 이동하여 더 큰 레디 스 인스턴스를 얻을. 그 t
푸른로 이동하여 더 큰 레디 스 인스턴스를 얻을. 그 t
from https://stackoverflow.com/questions/29569997/azure-redis-cache-multiple-errors-timeoutexception-timeout-performing-get-ke by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 나는 각 연결에 대한 새로운 레디 스 클라이언트를 생성해야 하는가? (0) | 2020.01.08 |
---|---|
[REDIS] 레디 스는 단일 스레드입니다. 그럼 왜 상추를 사용해야합니까? (0) | 2020.01.08 |
[REDIS] 레디 스 복제 설정 (0) | 2020.01.08 |
[REDIS] 레디 스에서 푸른 캐시 / DataCache 스타일의 지역 (0) | 2020.01.08 |
[REDIS] 레디 스 루아 스크립트에서 함수를 여러 번 호출 질수 (0) | 2020.01.08 |