1

我正在使用 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吗?

4

1 回答 1

2

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

using(var redis = new RedisClient()) { ... }语句确实处理了客户端连接,不幸的是,当您使用 Disposed 客户端进行任何进一步调用时,它会再次重新打开连接,并且由于它不在 using 语句中或未手动处理,因此将保持连接打开。

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

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

List<T>这将返回一个与 RedisList 代理分离的填充普通 C# 。

于 2012-11-16T20:34:39.650 回答