2016-02-25 74 views
2

我正在連接到Azure Redis,它們向我顯示與我的redis服務器打開連接的數量。我有以下的c#代碼,它包含了我的所有Redis集合並獲取。這是否應該泄露連接?Redis連接可能未與c關閉#

 using (var connectionMultiplexer = ConnectionMultiplexer.Connect(connectionString)) 
     { 

      lock (Locker) 
      { 
       redis = connectionMultiplexer.GetDatabase(); 
      } 

      var o = CacheSerializer.Deserialize<T>(redis.StringGet(cacheKeyName)); 
      if (o != null) 
      { 
       return o; 
      } 
      lock (Locker) 
      { 
       // get lock but release if it takes more than 60 seconds to complete to avoid deadlock if this app crashes before release 
       //using (redis.AcquireLock(cacheKeyName + "-lock", TimeSpan.FromSeconds(60))) 

       var lockKey = cacheKeyName + "-lock"; 
       if (redis.LockTake(lockKey, Environment.MachineName, TimeSpan.FromSeconds(10))) 
       { 
        try 
        { 
         o = CacheSerializer.Deserialize<T>(redis.StringGet(cacheKeyName)); 
         if (o == null) 
         { 
          o = func(); 
          redis.StringSet(cacheKeyName, CacheSerializer.Serialize(o), 
           TimeSpan.FromSeconds(cacheTimeOutSeconds)); 
         } 
         redis.LockRelease(lockKey, Environment.MachineName); 
         return o; 
        } 
        finally 
        { 
         redis.LockRelease(lockKey, Environment.MachineName); 
        } 
       } 
       return o; 
      } 

     } 
    } 

回答

2

您可以將connectionMultiplexer保留在靜態變量中,而不是爲每個get/set創建它。這將保持與Redis的一個連接始終打開並更快地執行您的操作。

更新: 請看看StackExchange.Redis基本用法: https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Basics.md

「需要注意的是ConnectionMultiplexer實現IDisposable,並可以在需要時不再被安置,但我故意不使用語句用法顯示,因爲想要簡單地使用ConnectionMultiplexer的情況非常罕見,因爲這個想法是重用這個對象。

它對我很好,保持與Azure Redis的單一連接(有時創建2連接,但這是設計)。希望它能幫助你。

+0

這就是我最初和我的顯示器顯示100s的打開連接時,我只有一個測試 –

+0

見上文。我更新了我的答案。 –

+0

謝謝。我會閱讀它並更新我的方法,看看我能否實現它。 –