2016-02-25 2 views
2

Я подключаюсь к Azure Redis, и они показывают мне количество открытых подключений к моему серверу redis. У меня есть следующий код C#, который охватывает все мои команды Redis и получает. Должны ли это быть утечки соединений?Redis Connections могут не закрываться с помощью 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

Это то, что у меня было первоначально, и мой монитор показал 100 открытых соединений, когда я был только одним тестированием –

+0

См. Выше. Я обновил свой ответ. –

+0

Спасибо. Я прочитаю это и обновлю свой метод и посмотрю, смогу ли я заставить его работать. –

Смежные вопросы