Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

ServiceStack.Redis Não é possível ler o transporte - BasicRedisClientManager


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á possui IRedisClientsManager propriedade e acima do clichê.