Redis をデータベースとして使用する Web サービスを設計しています。StackService クライアントと接続する Redis を使用するためのベスト プラクティスを知りたいです。
要点は、私が Redis について読んでいて、サーバーとやり取りする最良の方法は単一の同時接続を使用することであることがわかったということです。
問題は、Web クライアントが Web サービスにリクエストを行うたびにPooledRedisClientManagerを使用しているにもかかわらず、redis サーバーに接続されたクライアント (開かれた接続) がもう 1 つ取得され、この接続されたクライアントの数が無制限に増加し、さらに多くを消費することです。より多くのメモリ。
サンプルの「障害」コード:
PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost");
var redisClient = pooledClientManager.GetClient();
using (redisClient)
{
redisClient.Set("key1", "value1");
}
問題を解決するために私がしたことは、静的変数を持つシングルトン パターンを実装するクラスを作成することRedisClient
です。初期化されていない場合は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");
}
これは良い習慣ですか?
前もって感謝します!