Klient połączonych usług Redis ServiceStack

Projektuję usługę internetową, która wykorzystuje Redis jako bazę danych i chcę poznać najlepsze praktyki dotyczące korzystania z połączenia Redis z klientem StackService.

Chodzi o to, że czytałem o Redis i odkryłem, że najlepszym sposobem na interakcję z serwerem jest użycie jednego połączenia równoległego.

Problem polega na tym, że używamPooledRedisClientManager za każdym razem, gdy klient WWW wysyła żądanie do usługi internetowej, otrzymuję jeszcze jednego podłączonego klienta (otwarte połączenie) do serwera redis, a liczba podłączonych klientów rośnie bez ograniczeń, zużywając coraz więcej pamięci.

Przykładowy kod „błędu”:

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

Aby rozwiązać ten problem, stworzyłem klasę implementującą wzorzec singletonu ze statycznymRedisClient var; Co jeśliredisClient nie jest zainicjowany tworzy nowy, a jeśli tak, zwraca zainicjowany.

Rozwiązanie:

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");
}

Czy to dobra praktyka?

Z góry dziękuję!

questionAnswers(1)

yourAnswerToTheQuestion