Ich entwerfe einen Webdienst, der Redis als Datenbank verwendet, und ich möchte die besten Praktiken für die Verwendung von Redis Verbindung mit StackService-Client kennen.
Der Punkt ist, dass ich über Redis gelesen habe und ich fand, dass der beste Weg, um mit dem Server zu interagieren, ist durch die Verwendung einer einzigen gleichzeitigen Verbindung.
Das Problem ist, dass ich trotz der Verwendung von PooledRedisClientManager jedes Mal, wenn ein Web-Client eine Anfrage an den Webdienst stellt, erhalte ich einen weiteren verbundenen Client (geöffnete Verbindung) zum Redis-Server und diese Anzahl verbundener Clients steigt unbegrenzt an und verbraucht immer mehr Speicher.
Das Beispiel für einen "Fehler"-Code:
PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost");
var redisClient = pooledClientManager.GetClient();
using (redisClient)
{
redisClient.Set("key1", "value1");
}
Ich habe das Problem gelöst, indem ich eine Klasse erstellt habe, die das Singleton-Muster mit einer statischen RedisClient
var; Was, wenn die redisClient
nicht initialisiert ist, wird eine neue erstellt, und wenn sie initialisiert ist, wird die initialisierte zurückgegeben.
Lösung:
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");
}
Ist dies eine gute Praxis?
Vielen Dank im Voraus!