2014-09-25 24 views
11

我在单个计算机查询缓存的高负载情况下使用Azure Redis缓存。这台机器每秒钟大概获得并设置约20个物品。在白天这增加,在夜间这是少。为什么连接到Azure Redis Cache如此之高?

到目前为止,事情一直很好。今天,我意识到“连接客户端”的指标非常高,尽管我只有1个客户端只是不断获取和设置项目。这里是我的意思是度量的截图: Redis Cache Connected Clients

我的代码如下所示:

public class RedisCache<TValue> : ICache<TValue> 
{ 
    private IDatabase cache; 
    private ConnectionMultiplexer connectionMultiplexer; 

    public RedisCache() 
    { 
     ConfigurationOptions config = new ConfigurationOptions(); 
     config.EndPoints.Add(GlobalConfig.Instance.GetConfig("RedisCacheUrl")); 
     config.Password = GlobalConfig.Instance.GetConfig("RedisCachePassword"); 
     config.ConnectRetry = int.MaxValue; // retry connection if broken 
     config.KeepAlive = 60; // keep connection alive (ping every minute) 
     config.Ssl = true; 
     config.SyncTimeout = 8000; // 8 seconds timeout for each get/set/remove operation 
     config.ConnectTimeout = 20000; // 20 seconds to connect to the cache 

     connectionMultiplexer = ConnectionMultiplexer.Connect(config); 
     cache = connectionMultiplexer.GetDatabase(); 
    } 

    public virtual bool Add(string key, TValue item) 
    { 
     return cache.StringSet(key, RawSerializationHelper.Serialize(item)); 
    } 

我没有创建这个类的多个实例,所以这不是问题。也许我误解了连接度量标准,他们的真正含义是我访问缓存的次数,但是,在我看来,这并不合理。任何想法,或任何有类似问题的人?

回答

14

StackExchange.Redis有一个竞争条件,可能导致在某些情况下泄漏连接。这已经修复为1.0.333或更新版本。

如果您想确认这是您遇到的问题,请获取客户端应用程序的崩溃转储,并在调试器中查看堆中的对象。寻找大量的StackExchange.Redis.ServerEndPoint对象。

此外,一些用户的代码中存在一些导致连接对象泄漏的错误。这通常是因为他们的代码尝试重新创建ConnectionMultiplexer对象,如果它们看到故障或断开状态。实际上不需要重新创建ConnectionMultiplexer,因为它内部具有逻辑以根据需要重新创建连接。只要确保在连接字符串中将abortConnect设置为false即可。

如果您决定重新创建连接对象,请确保在释放对它的所有引用之前处置旧对象。

以下是我们推荐的模式:


     private static Lazy lazyConnection = new Lazy(() => { 
      return ConnectionMultiplexer.Connect("contoso5.redis.cache.windows.net,abortConnect=false,ssl=true,password=..."); 
     }); 

     public static ConnectionMultiplexer Connection { 
      get { 
       return lazyConnection.Value; 
      } 
     } 
+1

谢谢JonCole,这一直是问题。更新到1.0.333解决了这个问题。 – Christian 2014-09-26 07:30:17