redis ConnectionMultiplexer如何处理断开连接?

46scxncf  于 2023-04-05  发布在  Redis
关注(0)|答案(2)|浏览(218)

StackExchange.Redis的Basic Usage文档解释说ConnectionMultiplexer是长期存在的,并且预计会被重用。
但是当与服务器的连接断开时呢?ConnectionMultiplexer会自动重新连接吗?或者有必要像this answer那样编写代码(引用该答案):

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

上面的代码是否适合处理断开连接的恢复,或者它实际上会导致多个ConnectionMultiplexer示例?同样,应该如何解释IsConnected属性?

q3qa4bjr

q3qa4bjr1#

以下是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;
    }
}

以下是几点要点:

  • 它使用Lazy来处理线程安全的初始化
  • 它设置“abortConnect=false”,这意味着如果初始连接尝试失败,ConnectionMultiplexer将在后台静默重试,而不是抛出异常。
  • 它不检查IsConnected属性,因为ConnectionMultiplexer会在连接断开时自动在后台重试。
eufgjt7s

eufgjt7s2#

是的,你需要这种类型的验证来修复断开的连接。一些线程安全也应该考虑在内。这是我通常这样做的:

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

然后我在需要调用Redis端点的任何地方都使用RedisMultiplexer属性。我通常不存储GetDatabase()调用的结果,因为文档说这是一个非常轻量级的调用。

相关问题