Redis
 sql >> Datenbank >  >> NoSQL >> Redis

ServiceStack.Redis Transport kann nicht gelesen werden – BasicRedisClientManager

Sie sollten keine Singleton-Instanzen von RedisClient halten oder IRedisTypedClient<BarSet> die beide eine nicht threadsichere Redis-TCP-Verbindung kapseln. Sie können stattdessen Singleton-Instanzen von IRedisClientsManager halten - was der Zweck ist, eine Thread-sichere Redis-Client-Factory (wie einen DB-Verbindungspool) bereitzustellen.

Wenn Sie auch ServiceStack-Dienste verwenden, ist es einfacher, Abhängigkeiten im IOC von ServiceStack zu registrieren, also IRedisClientsManager kann wie jede andere Abhängigkeit eingefügt werden, z. B. in AppHost.Configure() :

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

Dadurch können Sie base.Redis verwenden RedisClient-Eigenschaft in Ihren ServiceStack-Diensten, z. B.:

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

Wenn Sie base.Redis verwenden Sie müssen den RedisClient nicht explizit entsorgen, da er bereits automatisch vom Dienst entsorgt wird, d. h.:

public class Service
{
    ...

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

Sie können auch IRedisClientsManager einfügen in Ihre eigenen Klassen wie jede andere Abhängigkeit mit einer öffentlichen Eigenschaft oder einem Konstruktorargument, z. B.:

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

Die Sie dann im IOC von ServiceStack registrieren und automatisch verdrahten können mit:

container.RegisterAutoWired<RedisBarSetData>();

Dadurch können Sie es dann als Abhängigkeit in Ihren Diensten verwenden:

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

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

Eine Alternative zum Erstellen Ihrer eigenen Basisklasse besteht darin, von der bereits vorhandenen LogicBase-Basisklasse zu erben, die bereits über IRedisClientsManager verfügt Eigentum und über Boilerplate.