使用后不使用IRedisClient

时间:2012-11-16 17:32:54

标签: redis servicestack

我正在使用ServiceStack IRedis客户端,如下所示

public static IRedisList<MyType> getList(string listkey)
{
   using(var redis = new RedisClient())
   {
      var client = redis.As<MyType>();
      return client.Lists[listkey];
   }

}


public void AddSomething(MyType newType)
{
   var list = getList("somekey);
   list.Add(newType);.

}

根据Redis-Server输出,每次我这样做时都会添加一个新的客户端连接,并且它永远不会被处理掉。 (客户数量一直在增加)。

我不应该这样操纵IRedisList吗?

1 个答案:

答案 0 :(得分:2)

IRedisList就像是redis服务器端列表的代理包装器,其中包含对创建的 RedisClient 的引用,以便与Redis对话。

using(var redis = new RedisClient()) { ... }语句确实处理了客户端连接,遗憾的是当您使用Disposed客户端进行任何进一步调用时,它会再次重新打开连接,因为它不在using语句中或者没有手动处理保持连接畅通。

为了防止这种情况发生,您不应该在创建它的RedisClient的使用范围之外访问RedisList代理。如果您仍想引用此范围之外的列表,则应将内容克隆到具有以下内容的内存列表中:

var disconnectedInMemoryCopy = client.Lists[listKey].ToList();

这将返回从RedisList代理解除耦合的填充正常C#List<T>