ConnectionMultiplexer如何处理断开连接?

Gig*_*igi 15 c# redis stackexchange.redis

StackExchange.Redis 的基本用法文档解释说它ConnectionMultiplexer是长期存在的并且有望被重用.

但是什么时候与服务器的连接被打破了?是否ConnectionMultiplexer自动重新连接,或者是否需要按照此答案编写代码(引用该答案):

        if (RedisConnection == null || !RedisConnection.IsConnected)
        {
            RedisConnection = ConnectionMultiplexer.Connect(...);
        }
        RedisCacheDb = RedisConnection.GetDatabase();
Run Code Online (Sandbox Code Playgroud)

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

[旁白:我相信上面的代码是一种非常糟糕的延迟初始化形式,特别是在多线程环境中 - 参见Jon Skeet关于Singletons的文章 ].

Mik*_*der 27

以下是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;
    }
}
Run Code Online (Sandbox Code Playgroud)

一些要点:

  • 它使用Lazy <T>来处理线程安全的初始化
  • 它设置"abortConnect = false",这意味着如果初始连接尝试失败,ConnectionMultiplexer将在后台静默重试,而不是抛出异常.
  • 它并没有检查IsConnected财产,因为如果连接中断ConnectionMultiplexer会在后台自动重试.