Ich entwerfe einen Webdienst, der Redis als Datenbank verwendet, und ich möchte die Best Practices für die Verwendung von Redis beim Verbinden mit dem StackService-Client kennenlernen.Redis serviceStack gepoolter Verbindungsclient
Der Punkt ist, dass ich über Redis gelesen habe und ich fand, dass die beste Art, mit dem Server zu interagieren, ist, eine einzelne gleichzeitige Verbindung zu verwenden.
Das Problem ist, dass trotz ich verwende PooledRedisClientManager jedes Mal, wenn ein Web-Client eine Anfrage an den Web-Service macht ich eine Eins mehr angeschlossenes Client (geöffnete Verbindung) mit dem redis Server und diese Anzahl von verbundenem Client erhalten steigt ohne Limit und verbraucht mehr und mehr Speicher.
Die Probe ‚Fehler‘ Code:
PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost");
var redisClient = pooledClientManager.GetClient();
using (redisClient)
{
redisClient.Set("key1", "value1");
}
Was ich tat, um das Problem zu lösen, ist eine Klasse erstellen mit einem statischen RedisClient
var das Singletonmuster implementiert; Wenn die redisClient
nicht initialisiert wird, erstellt eine neue, und wenn dies der Fall 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 das eine gute Praxis?
Vielen Dank im Voraus!
Warum haben Sie einen ** redisClient ** aus dem Pool gezogen, verwenden ihn aber nicht? Verwenden Sie stattdessen ** pooledClientManager **? – mythz
Es war ein Fehler beim Schreiben der Frage, jetzt ist es korrigiert –
k, tho würde ich Ihre Frage bearbeiten, weil Ihr 'Fehlercode' jetzt funktioniert und die ** Lösung ** zur Verfügung gestellt ist nicht ideal. Fügen Sie hinzu, was das Problem war und beziehen Sie sich auf die akzeptierte Antwort für die ideale Lösung. – mythz