ConnectionMultiplexer如何处理断开连接?

StackExchange.Redis的基本用法文档解释了ConnectionMultiplexer是长期使用的,并且有望重用。

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

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

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

[旁白:我相信上面的代码是一种非常糟糕的延迟初始化forms,特别是在multithreading环境中 – 参见Jon Skeet关于Singletons的文章 ]。

以下是Azure Redis缓存团队推荐的模式 :

 private static Lazy lazyConnection = new Lazy(() => { 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将在后台静默重试,而不是抛出exception。
  • 它不检查IsConnected属性,因为如果连接断开,ConnectionMultiplexer将在后台自动重试。

是的,您需要这种类型的validation才能修复断开的连接。 一些线程安全性也应该考虑在内。 这就是我通常这样做的方式:

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

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