Redis serviceStack-Client für gepoolte Verbindungen

Ich entwerfe einen Webdienst, der Redis als Datenbank verwendet, und möchte die bewährten Methoden für die Verwendung von Redis kennen, um eine Verbindung mit dem StackService-Client herzustellen.

Der Punkt ist, dass ich über Redis gelesen habe und festgestellt habe, dass der beste Weg, mit dem Server zu interagieren, die Verwendung einer einzigen gleichzeitigen Verbindung ist.

Das Problem ist, dass trotz ich benutzePooledRedisClientManager Jedes Mal, wenn ein Web-Client eine Anfrage an den Web-Service stellt, erhalte ich einen weiteren verbundenen Client (geöffnete Verbindung) zum Redis-Server, und diese Anzahl verbundener Clients erhöht sich, ohne dass immer mehr Speicher verbraucht wird.

Der Beispiel-Fehlercode:

PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost");
var redisClient = pooledClientManager.GetClient();
using (redisClient)
{
   redisClient.Set("key1", "value1");
}

Was ich getan habe, um das Problem zu lösen, ist eine Klasse zu erstellen, die das Singleton-Muster mit einer statischen implementiertRedisClient var; Was, wenn derredisClient Wird diese nicht initialisiert, wird eine neue erstellt. 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 Übung?

Danke im Voraus!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage