[REDIS] StackExchange.Redis를 사용 RedisTimeoutException의 버스트
REDISStackExchange.Redis를 사용 RedisTimeoutException의 버스트
나는 StackExchange 레디 스 라이브러리를 사용하여 시간 초과 간헐적으로 "버스트"를 추적하기 위해 노력하고있어. 여기에 우리의 설정에 대한 약간의 : 우리의 API는 윈도우 2008 및 IIS에 C # 및 실행에 기록됩니다. 우리는 생산에 4 개 API 서버가, 우리는 (리눅스 최신 LTS를 실행) 4 레디 스 기계, 레디 스 2 인스턴스 (포트 7000에 하나의 마스터, 포트 7001에 슬레이브) 각이있다. 나는 레디 스 서버의 거의 모든 측면을 검토 한 결과 그들은 환상적인 보인다. 아니 로그, CPU 오류와 네트워크가 큰는 사물의 서버 측에 모든 환상적인 보이지 않는다. 나는 이런 일이 (예 : 재 작성 AOF 파일 또는 아무것도 등) 일반 중 아무것도 표시되지 않는 상태에서 레디 스 -f 꼬리를 기록 할 수 있습니다. 나는 문제가 레디 스로 생각하지 않습니다.
여기에 지금까지 무엇을 알고 :
여기에 예를 들어 시간 제한 예외입니다. 거의 같은이 같은 대부분의보기 :
나는이 시간 제한 예외를 아래로 추적에 대한 연구의 조금을 완료,하지만 오히려 놀라운 것은 모든 숫자 모두 0입니다입니다했습니다. 큐에 아무것도, 아무것도 대기 나는 자유와 아무것도하지 스레드의 톤이 처리되지 않을 수 있습니다. 모든 것이 멋지다.
누군가는이 문제를 해결하는 방법에 대한 아이디어가? 문제는 캐시 시간 제한의 이러한 버스트는 우리의 데이터베이스가 더 타격되도록하고, 특정 상황이 나쁜 것입니다. 나는 누군가가 도움 것이 더 이상 정보를 추가 할 행복 해요.
업데이트 : 연결 코드
레디 스에 연결하는 코드는 다양한 캐시 환경과 구성을 지원하는 상당히 복잡한 시스템의 일부입니다,하지만 난 아마도 기본에로 요약 할 수 있습니다. 첫째, CacheFactory 클래스가있다 :
public class CacheFactory : ICacheFactory
{
private static readonly ILogger log = LoggerManager.GetLogger(typeof(CacheFactory));
private static readonly ICacheProvider<CacheKey> cache;
static CacheFactory()
{
ICacheFactory<CacheKey> configuredFactory = CacheFactorySection.Current?.CreateConfiguredFactory<CacheKey>();
if (configuredFactory == null)
{
// Some error handling, not important
}
cache = configuredFactory.GetDefaultCache();
}
// ...
}
ICacheProvider 구성 할 수 있습니다 특정 캐시 시스템, 이야기 할 수있는 방법을 구현하는 것입니다. 이 경우, configuredFactory은 다음과 같이 보이는 RedisCacheFactory입니다 :
public class RedisCacheFactory<T> : ICacheFactory<T> where T : CacheKey, ICacheKeyRepository
{
private RedisCacheProvider<T> provider;
private readonly RedisConfiguration configuration;
public RedisCacheFactory(RedisConfiguration config)
{
this.configuration = config;
}
public ICacheProvider<T> GetDefaultCache()
{
return provider ?? (provider = new RedisCacheProvider<T>(configuration));
}
}
GetDefaultCache 방법은 정적 생성자에 한 번이라고하고, RedisCacheProvider을 반환합니다. 이 클래스는 실제로 레디 스에 연결하는 것입니다 :
public class RedisCacheProvider<K> : ICacheProvider<K> where K : CacheKey, ICacheKeyRepository
{
private readonly ConnectionMultiplexer redisConnection;
private readonly IDatabase db;
private readonly RedisCacheSerializer serializer;
private static readonly ILog log = Logging.RedisCacheProviderLog<K>();
private readonly CacheMonitor<K> cacheMonitor;
private readonly TimeSpan defaultTTL;
private int connectionErrors;
public RedisCacheProvider(RedisConfiguration options)
{
redisConnection = ConnectionMultiplexer.Connect(options.EnvironmentOverride ?? options.Connection);
db = redisConnection.GetDatabase();
serializer = new RedisCacheSerializer(options.SerializationBinding);
cacheMonitor = new CacheMonitor<K>();
defaultTTL = options.DefaultTTL;
IEnumerable<string> hosts = options.Connection.EndPoints.Select(e => (e as DnsEndPoint)?.Host);
log.InfoFormat("Created Redis ConnectionMultiplexer connection. Hosts=({0})", String.Join(",", hosts));
}
// ...
}
생성자 (일부 구성 파일에) 구성된 레디 스 끝점에 기초 ConnectionMultiplexer를 생성한다. 나는 또한 연결을 만들 때마다 로그인합니다. 우리는 이러한 로그 문 과도한 수를 확인하지 않으며, 레디 스에 대한 연결이 안정적으로 유지.
해결법
-
==============================
1.Global.asax에에에하는 추가 시도 :
Global.asax에에에하는 추가 시도 :
protected void Application_Start(object sender, EventArgs e) { ThreadPool.SetMinThreads(200, 200); }
우리에게이 일 ~ 50 ~ 100에서 제로로 오류를 감소시켰다. 그래서 최종에 실험 일부가 필요할 수 있습니다 의존 그것의 시스템과 같은 세트에 어떤 숫자 (우리를 위해 200 개 작품)에 대한 일반적인 규칙이 없다 생각합니다.
나는이 사이트의 성능을 개선했다 생각합니다.
from https://stackoverflow.com/questions/51936394/bursts-of-redistimeoutexception-using-stackexchange-redis by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 한 레디 스 루아 스크립트를 사용하여 여러 개의 DB를 사용? (0) | 2020.01.19 |
---|---|
[REDIS] 레디 스에서 HashMap의 값 세트 만료? (0) | 2020.01.19 |
[REDIS] 레디 스 클러스터 마스터 슬레이브 - 키를 추가 할 수 없습니다 (0) | 2020.01.19 |
[REDIS] 어느되는 NoSQL 데이터베이스는 대량 삽입 / 쓰기에 가장 적합합니다? (0) | 2020.01.19 |
[REDIS] NOAUTH 인증이 필요합니다. Laravel + 레디 스 (0) | 2020.01.19 |