私はデータベースとして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");
}
これは良い習慣ですか?
ありがとうございます!
プールから** redisClient **を引き出しましたが、使用していないのはなぜですか?代わりに** pooledClientManager **を使用していますか? – mythz
質問を書いて間違いましたが、修正されました –
k、あなたの「フォルトコード」が機能し、**解決策**が理想的ではないため、あなたの質問を編集します。問題の内容を追加し、理想的な解決策について受け入れられた回答を参照してください。 – mythz