9 Stimmen

Redis serviceStack pooled connection client

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!

16voto

eyossi Punkte 4180

Ich habe PooledRedisClientManager und es funktioniert gut:

Beispiel-Code die ich nur einmal ausführe :

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

und Code, den ich auf vielen Threads laufen lasse:

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

und ich habe nur 11 Clients mit dem Server verbunden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X