sql >> Base de Datos >  >> NoSQL >> Redis

ServiceStack.Redis No se puede leer el transporte - BasicRedisClientManager

No debe tener ninguna instancia singleton de RedisClient o IRedisTypedClient<BarSet> que encapsula una conexión Redis TCP no segura para subprocesos. En su lugar, puede mantener instancias singleton de IRedisClientsManager - cuyo propósito es proporcionar una Redis Client Factory segura para subprocesos (como un conjunto de conexiones de base de datos).

Si también usa los servicios de ServiceStack, es más fácil registrar las dependencias en el IOC de ServiceStack, así que IRedisClientsManager se puede inyectar como cualquier otra dependencia, por ejemplo, en AppHost.Configure() :

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

Esto le permitirá usar base.Redis RedisClient propiedad en sus Servicios ServiceStack, por ejemplo:

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

Si usa base.Redis no es necesario que elimine explícitamente RedisClient, ya que el Servicio ya lo eliminó automáticamente, es decir:

public class Service
{
    ...

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

También puede inyectar IRedisClientsManager en sus propias clases como cualquier otra dependencia usando una propiedad pública o un argumento Constructor, por ejemplo:

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 luego puede registrar y autoconectar en el IOC de ServiceStack con:

container.RegisterAutoWired<RedisBarSetData>();

Lo que luego le permitirá usarlo como una dependencia en sus Servicios:

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

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

Una alternativa a la creación de su propia clase base es heredar de la clase base LogicBase preexistente, que ya tiene IRedisClientsManager propiedad y por encima del estándar.