Redis
 sql >> Database >  >> NoSQL >> Redis

ServiceStack.Redis Impossibile leggere il trasporto - BasicRedisClientManager

Non dovresti contenere istanze singleton di RedisClient o IRedisTypedClient<BarSet> che entrambi incapsula una connessione Redis TCP non thread-safe. Puoi invece tenere istanze singleton di IRedisClientsManager - che è il suo scopo di fornire una fabbrica client Redis thread-safe (come un pool di connessioni DB).

Se stai utilizzando anche i servizi ServiceStack, è più facile registrare le dipendenze nell'IOC di ServiceStack, quindi IRedisClientsManager può essere iniettato come qualsiasi altra dipendenza, ad esempio in AppHost.Configure() :

container.Register<IRedisClientsManager>(c =>
    new BasicRedisClientManager("[email protected]:6379"));

Ciò ti consentirà di utilizzare base.Redis RedisClient nei tuoi servizi ServiceStack, ad esempio:

public class JmaSetsService : Service
{
    public object Get(JmaSets request)
    {
        var redisBarSets = base.Redis.As<BarSet>();
        return redisBarSets.Lists[instument_key].GetAll();
    }
}

Se usi base.Redis non è necessario disporre esplicitamente del RedisClient in quanto è già automaticamente eliminato dal Servizio, ovvero:

public class Service
{
    ...

    public virtual void Dispose()
    {
        if (redis != null)
            redis.Dispose();
        ...
    }
}

Puoi anche iniettare IRedisClientsManager nelle tue classi come qualsiasi altra dipendenza usando una proprietà pubblica o un argomento Costruttore, ad esempio:

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

Che puoi quindi registrare e collegare automaticamente nell'IOC di ServiceStack con:

container.RegisterAutoWired<RedisBarSetData>();

Ciò ti consentirà quindi di utilizzarlo come dipendenza nei tuoi Servizi:

public class JmaSetsService : Service
{
    public RedisBarSetData RedisBarSetData { get; set; }

    public object Get(JmaSets request)
    {
        return RedisBarSetData.getData(new BarSets(request));
    }
}

Un'alternativa alla creazione della propria classe base consiste nell'ereditare dalla classe base LogicBase preesistente, che ha già IRedisClientsManager proprietà e sopra boilerplate.