一尘不染

ConnectionMultiplexer如何处理断开连接?

redis

StackExchange.Redis的“
基本用法”文档解释说,该方法ConnectionMultiplexer是长期存在的,有望重新使用。

但是,当与服务器的连接断开时该怎么办?是否ConnectionMultiplexer自动重新连接,或者是否有必要像此答案一样编写代码(引用该答案):

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

上面的代码是处理断开连接恢复的好方法,还是实际上会导致多个ConnectionMultiplexer实例?同样,该IsConnected属性应如何解释?

[另外:我相信上面的代码是惰性初始化的一种非常糟糕的形式,尤其是在多线程环境中-请参阅 Jon
Skeet在Singletons上的文章

]。


阅读 1319

收藏
2020-06-20

共1个答案

一尘不染

这是Azure Redis缓存团队建议模式

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会在后台自动重试。
2020-06-20