sql >> Databáze >  >> NoSQL >> Redis

ServiceStack.Redis Nelze číst transport - BasicRedisClientManager

Neměli byste uchovávat žádné jednotlivé instance RedisClient nebo IRedisTypedClient<BarSet> které oba zapouzdřují připojení Redis TCP Connection, které není bezpečné pro vlákna. Místo toho můžete držet jednotlivé instance IRedisClientsManager - jehož účelem je poskytnout vláknově zabezpečenou Redis Client Factory (jako fond připojení DB).

Pokud také používáte ServiceStack Services, je jednodušší zaregistrovat závislosti v IOC ServiceStack, takže IRedisClientsManager lze vložit jako jakoukoli jinou závislost, např. v AppHost.Configure() :

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

To vám umožní používat base.Redis Vlastnost RedisClient ve vašich službách ServiceStack, např.:

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

Pokud používáte base.Redis nemusíte RedisClient výslovně zlikvidovat, protože je již automaticky zlikvidován službou, tj.:

public class Service
{
    ...

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

Můžete také aplikovat IRedisClientsManager do vašich vlastních tříd jako jakékoli jiné závislosti pomocí veřejné vlastnosti nebo argumentu konstruktoru, např.:

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

Které se pak můžete zaregistrovat a autowire v IOC ServiceStack s:

container.RegisterAutoWired<RedisBarSetData>();

Což vám pak umožní používat jej jako závislost ve vašich službách:

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

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

Alternativou k vytvoření vlastní základní třídy je dědění z již existující základní třídy LogicBase, která již má IRedisClientsManager majetku a nad typovým štítkem.




  1. Implementujte funkci automatického dokončování pomocí vyhledávání MongoDB

  2. Má mongoDB problémy s opětovným připojením nebo to dělám špatně?

  3. Cizí klíče v mongo?

  4. Jak nasadit MongoDB pro vysokou dostupnost