Redis serviceStack cliente de conexión agrupada
Estoy diseñando un servicio web que usa Redis como una base de datos, y quiero conocer las mejores prácticas para usar Redis conectando con el cliente StackService.
El punto es que he estado leyendo sobre Redis y descubrí que la mejor manera de interactuar con el servidor es mediante una única conexión simultánea.
El problema es que a pesar de que estoy usandoPooledRedisClientManager Cada vez que un cliente web realiza una solicitud al servicio web, obtengo un cliente más conectado (conexión abierta) al servidor redis y este número de clientes conectados aumenta sin límite y consume más y más memoria.
El código de 'falla' de muestra:
PooledRedisClientManager pooledClientManager = new PooledRedisClientManager("localhost");
var redisClient = pooledClientManager.GetClient();
using (redisClient)
{
redisClient.Set("key1", "value1");
}
Lo que hice para resolver el problema es crear una clase que implementa el patrón de singleton con una estática.RedisClient
var; Que si elredisClient
no se inicializa crea uno nuevo y, si lo está, devuelve el inicializado.
Solución:
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");
}
¿Es esta una buena practica?
¡Gracias de antemano!