Question Comment ConnectionMultiplexer gère-t-il les déconnexions?


le Utilisation de base documentation pour StackExchange.Redis explique que le ConnectionMultiplexer est de longue durée et devrait être réutilisé.

Mais qu'en est-il lorsque la connexion au serveur est rompue? Est-ce que ConnectionMultiplexer se reconnecter automatiquement, ou faut-il écrire du code comme dans cette réponse (en citant cette réponse):

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

Le code ci-dessus est-il quelque chose de bon pour gérer la récupération à partir de déconnexions, ou est-ce qu'il en résulterait plusieurs ConnectionMultiplexer instances? Dans le même ordre d’idées, comment IsConnected la propriété soit interprétée?

[À part: Je crois que le code ci-dessus est une forme assez mal d'initialisation paresseuse, en particulier dans les environnements multithread - voir L'article de Jon Skeet sur Singletons].


12
2018-03-01 09:56


origine


Réponses:


Voici la modèle recommandé par l'équipe Azure Redis Cache:

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;
    }
}

Quelques points importants:

  • Il utilise Lazy <T> pour gérer l'initialisation thread-safe
  • Il définit "abortConnect = false", ce qui signifie que si la tentative de connexion initiale échoue, le ConnectionMultiplexer réessayera silencieusement en arrière-plan plutôt que de lancer une exception.
  • Cela fait ne pas vérifiez la propriété IsConnected, car ConnectionMultiplexer réessayera automatiquement en arrière-plan si la connexion est abandonnée.

21
2018-03-02 23:15



Oui, vous avez besoin de ce type de vérification pour réparer les connexions brisées. Une certaine sécurité des fils devrait également être prise en compte. Voici comment je le fais habituellement:

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;
        }
    }
}

Ensuite, j'utilise le RedisMultiplexer propriété partout où je dois appeler le point final Redis. Je ne stocke généralement pas le résultat du GetDatabase() appel parce que la documentation dit que c'est un appel assez léger.


0
2018-03-01 10:11