Você não deve manter nenhuma instância singleton de
RedisClient
ou IRedisTypedClient<BarSet>
que ambos encapsulam uma conexão TCP Redis não thread-safe. Em vez disso, você pode manter instâncias singleton de IRedisClientsManager
- que tem como objetivo fornecer um Redis Client Factory seguro para threads (como um pool de conexão de banco de dados). Se você também estiver usando o ServiceStack Services, é mais fácil registrar dependências no IOC do ServiceStack, então
IRedisClientsManager
pode ser injetado como qualquer outra dependência, por exemplo, em AppHost.Configure()
:container.Register<IRedisClientsManager>(c =>
new BasicRedisClientManager("[email protected]:6379"));
Isso permitirá que você use o
base.Redis
propriedade RedisClient em seus Serviços ServiceStack, por exemplo:public class JmaSetsService : Service
{
public object Get(JmaSets request)
{
var redisBarSets = base.Redis.As<BarSet>();
return redisBarSets.Lists[instument_key].GetAll();
}
}
Se você usa
base.Redis
você não precisa descartar explicitamente o RedisClient, pois ele já é descartado automaticamente pelo Serviço, ou seja:public class Service
{
...
public virtual void Dispose()
{
if (redis != null)
redis.Dispose();
...
}
}
Você também pode injetar
IRedisClientsManager
em suas próprias classes como qualquer outra dependência usando uma propriedade pública ou argumento Construtor, por exemplo:public class RedisBarSetData
{
public virtual IRedisClientsManager RedisManager { get; set; }
private IRedisClient redis;
public virtual IRedisClient Redis
{
get { return redis ?? (redis = RedisManager.GetClient()); }
}
public override void Dispose()
{
if (redis != null)
redis.Dispose();
}
public List<BarSet> getData(BarSets data)
{
setKeys(data); // instrument_key is set in here
return Redis.As<BarSet>().Lists[instrument_key].GetAll();
}
}
Que você pode registrar e conectar automaticamente no IOC do ServiceStack com:
container.RegisterAutoWired<RedisBarSetData>();
O que permitirá que você o use como uma dependência em seus Serviços:
public class JmaSetsService : Service
{
public RedisBarSetData RedisBarSetData { get; set; }
public object Get(JmaSets request)
{
return RedisBarSetData.getData(new BarSets(request));
}
}
Uma alternativa para criar sua própria classe base é herdar da classe base LogicBase preexistente, que já possuiIRedisClientsManager
propriedade e acima do clichê.