sql >> Databasteknik >  >> NoSQL >> Redis

ServiceStack.Redis Kan inte läsa transport - BasicRedisClientManager

Du bör inte ha några enstaka instanser av RedisClient eller IRedisTypedClient<BarSet> som båda inkapslar en icke trådsäker Redis TCP-anslutning. Du kan istället hålla enstaka instanser av IRedisClientsManager - vilket är dess syfte att tillhandahålla en trådsäker Redis Client Factory (som en DB Connection Pool).

Om du också använder ServiceStack Services är det lättare att registrera beroenden i ServiceStacks IOC så IRedisClientsManager kan injiceras som alla andra beroenden, t.ex. i AppHost.Configure() :

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

Detta gör att du kan använda base.Redis RedisClient-egenskap i dina ServiceStack-tjänster, t.ex.:

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

Om du använder base.Redis du behöver inte uttryckligen göra dig av med RedisClienten eftersom den redan kasseras automatiskt av Tjänsten, dvs:

public class Service
{
    ...

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

Du kan också injicera IRedisClientsManager i dina egna klasser som alla andra beroenden med hjälp av en offentlig egendom eller konstruktorargument, t.ex.:

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

Som du sedan kan registrera och koppla in i ServiceStacks IOC med:

container.RegisterAutoWired<RedisBarSetData>();

Vilket sedan låter dig använda det som ett beroende i dina tjänster:

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

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

Ett alternativ till att skapa din egen basklass är att ärva från den redan existerande LogicBase-basklassen, som redan har IRedisClientsManager fastighet och över pannplåt.




  1. Bästa sättet att ansluta till MongoDB med Node.js

  2. Använda MongoDB $pull för att ta bort dokument inom en Array

  3. Python Redis interaktion

  4. Räkna resultat med MongoDB 3.0 Java Driver