복붙노트

[REDIS] 어떻게 ConnectionMultiplexer는 연결 해제를 처리합니까?

REDIS

어떻게 ConnectionMultiplexer는 연결 해제를 처리합니까?

StackExchange.Redis에 대한 기본 사용 설명서는 ConnectionMultiplexer는 수명이 긴되고 재사용 될 것으로 예상한다고 설명한다.

그러나 서버에 대한 연결이 무엇을 고장에 대한 때? 합니까 ConnectionMultiplexer은 자동으로 다시 연결하거나 코드를 작성하는 데 필요한 그것 (그 대답을 인용)이 대답과 같다 :

        if (RedisConnection == null || !RedisConnection.IsConnected)
        {
            RedisConnection = ConnectionMultiplexer.Connect(...);
        }
        RedisCacheDb = RedisConnection.GetDatabase();

연결이 끊어 회복을 처리하기 위해 위의 코드 뭔가 좋은, 아니면 실제로 여러 ConnectionMultiplexer 인스턴스 초래? 같은 맥락에서, 어떻게는, isConnected 속성을 해석해야 하는가?

[제외 : 나는 위의 코드는 특히 멀티 스레드 환경에서, 초기화 지연의 아주 나쁜 형태의 생각 - 싱글 톤에 존 소총의 문서를 참조].

해결법

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

    1.여기에 푸른 레디 스 캐시 팀에서 권장하는 패턴은 다음과 같습니다

    여기에 푸른 레디 스 캐시 팀에서 권장하는 패턴은 다음과 같습니다

    private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() => {
        return ConnectionMultiplexer.Connect("mycache.redis.cache.windows.net,abortConnect=false,ssl=true,password=...");
    });
    
    public static ConnectionMultiplexer Connection {
        get {
            return lazyConnection.Value;
        }
    }
    

    몇 가지 중요한 포인트 :

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

    2.예, 수정하면 연결이 끊어하기 위해 검증의 형식이 필요합니다. 일부 스레드 안전은 또한뿐만 아니라에서 고려되어야한다. 이것은 내가 보통이 작업을 수행하는 방법이다 :

    예, 수정하면 연결이 끊어하기 위해 검증의 형식이 필요합니다. 일부 스레드 안전은 또한뿐만 아니라에서 고려되어야한다. 이것은 내가 보통이 작업을 수행하는 방법이다 :

    private static ConnectionMultiplexer _redis;
    private static readonly Object _multiplexerLock = new Object();
    
    private void ConnectRedis()
    {
        try
        {
            _redis = ConnectionMultiplexer.Connect("...<connection string here>...");
        }
        catch (Exception ex)
        {
            //exception handling goes here
        }
    }
    
    
    private ConnectionMultiplexer RedisMultiplexer
    {
        get
        {
            lock (_multiplexerLock)
            {
                if (_redis == null || !_redis.IsConnected)
                {
                    ConnectRedis();
                }
                return _redis;
            }
        }
    }
    

    나는 레디 스 엔드 포인트를 호출 할 필요가 사방 그럼 난 RedisMultiplexer 속성을 사용합니다. 문서가 꽤 경량 전화 말한다 때문에 나는 보통 GetDatabase () 호출의 결과를 저장하지 않습니다.

  3. from https://stackoverflow.com/questions/28792196/how-does-connectionmultiplexer-deal-with-disconnects by cc-by-sa and MIT license