1

次のようにServiceStackIRedisクライアントを使用しています

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のusingスコープ外でRedisListプロキシにアクセスしないでください。このスコープ外のリストを引き続き参照する場合は、次のコマンドを使用してコンテンツをインメモリリストに複製する必要があります。

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

List<T>これにより、RedisListプロキシから切り離された入力済みの通常のC#が返されます。

于 2012-11-16T20:34:39.650 に答える