2012-05-15 12 views
9

私はデータベースとしてRedisを使用するWebサービスを設計しており、RedisをStackServiceクライアントに接続するためのベストプラクティスを知りたいと思います。Redis serviceStackプールされた接続クライアント

重要な点は、私がRedisについて読んできたことです。サーバーとやり取りする最善の方法は、1つの同時接続を使用することです。

問題は、私はPooledRedisClientManagerにWebクライアントがWebサービスに要求を行うことをするたびに使用していたにもかかわらず、私はRedisのサーバと接続されたクライアントのこの番号に1以上の接続されたクライアント(開かれた接続)を取得することです制限なく増加し、ますます多くのメモリを消費する。

サンプルせい "コード:私は問題を解決するためにやった

PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost"); 
var redisClient = pooledClientManager.GetClient(); 
using (redisClient) 
{ 
    redisClient.Set("key1", "value1"); 
} 

、静的RedisClient VARとのシングルトンパターンを実装したクラスを作成することです。 redisClientが初期化されていない場合は新しいものを作成し、初期化されている場合は初期化したものを返します。

ソリューション:

public class CustomRedisPooledClient 
{ 
    private static CustomRedisPooledClient _instance = null; 
    public RedisClient redisClient = null; 

    // Objeto sincronización para hacer el Lock 
    private static object syncLock = new object(); 

    private CustomRedisPooledClient() 
    { 
     redisClient = new RedisClient("localhost"); 
    } 

    public static CustomRedisPooledClient GetPooledClient() 
    { 
     if (_instance == null) 
     { 
      lock (syncLock) 
      { 
       if (_instance == null) 
       { 
        _instance = new CustomRedisPooledClient(); 
       } 
      } 
     } 
     return _instance; 
    } 
} 

CustomRedisPooledClient customRedisPooledClient = CustomRedisPooledClient.GetPooledClient(); 
using (customRedisPooledClient.redisClient) 
{ 
    customRedisPooledClient.redisClient.Set("key1", "value1"); 
} 

これは良い習慣ですか?

ありがとうございます!

+0

プールから** redisClient **を引き出しましたが、使用していないのはなぜですか?代わりに** pooledClientManager **を使用していますか? – mythz

+0

質問を書いて間違いましたが、修正されました –

+1

k、あなたの「フォルトコード」が機能し、**解決策**が理想的ではないため、あなたの質問を編集します。問題の内容を追加し、理想的な解決策について受け入れられた回答を参照してください。 – mythz

答えて

16

私はPooledRedisClientManagerを使用し、それが正常に動作します:私は一度だけ実行

サンプルコード

static PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost"); 

やコード、私は多くのスレッド上で実行します。

var redisClient = pooledClientManager.GetClient(); 
using (redisClient) 
{ 
    redisClient.Set("key" + i.ToString(), "value1"); 
} 

とI 11台のクライアントのみがサーバーに接続しています。

+0

私も同じことをすると、ブラウザが要求するたびに新しいスレッドを取得します。私はそれをデバッグし、新しいスレッド(クライアント)は、redisClient.Set( "key" + i.ToString()、 "value1");コントロールが失われて永遠に開かれるようです。私はサービスURLを呼び出すウェブページをリフレッシュして100の接続したクライアントに到達しました –

+0

多分問題はすべてのリクエストでコードを実行するということですか? –

+0

"PooledRedisClientManager pooledClientManager = new PooledRedisClientManager(" localhost ");"を実行していませんか?毎回? – eyossi