Cliente de conexão agrupada do serviço Redis serviceStack
Estou projetando um serviço da Web que usa o Redis como um banco de dados e quero conhecer as práticas recomendadas para usar o Redis conectando-se ao cliente do StackService.
O ponto é que eu tenho lido sobre Redis e descobri que a melhor maneira de interagir com o servidor é usando uma única conexão simultânea.
O problema é que apesar de eu estar usandoPooledRedisClientManager cada vez que um cliente da web faz uma solicitação ao serviço da web, recebo mais um cliente conectado (conexão aberta) ao servidor redis e esse número de clientes conectados aumenta sem limite, consumindo mais e mais memória.
O código de 'falha' da amostra:
PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost");
var redisClient = pooledClientManager.GetClient();
using (redisClient)
{
redisClient.Set("key1", "value1");
}
O que eu fiz para resolver o problema, é criar uma classe implementando o padrão singleton com umRedisClient
var; Que se oredisClient
não inicializado cria um novo e, se estiver, retorna o inicializado.
Solução:
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");
}
Isso é uma boa prática?
Agradeço antecipadamente!