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

ServiceStack.Redis Kan ikke læse transport - BasicRedisClientManager

Du bør ikke have nogen singleton-forekomster af RedisClient eller IRedisTypedClient<BarSet> som begge indkapsler en ikke-trådsikker Redis TCP-forbindelse. Du kan i stedet holde singleton-forekomster af IRedisClientsManager - hvilket er dets formål at give en trådsikker Redis Client Factory (som en DB Connection Pool).

Hvis du også bruger ServiceStack Services, er det nemmere at registrere afhængigheder i ServiceStack's IOC, så IRedisClientsManager kan injiceres som enhver anden afhængighed, f.eks. i AppHost.Configure() :

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

Dette giver dig mulighed for at bruge base.Redis RedisClient-egenskab i dine ServiceStack-tjenester, f.eks.:

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

Hvis du bruger base.Redis du behøver ikke eksplicit at bortskaffe RedisClienten, da den allerede automatisk bortskaffes af Tjenesten, dvs.:

public class Service
{
    ...

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

Du kan også injicere IRedisClientsManager ind i dine egne klasser som enhver anden afhængighed ved hjælp af en offentlig ejendoms- eller Constructor-argument, f.eks.:

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 så kan registrere og autowire i ServiceStack's IOC med:

container.RegisterAutoWired<RedisBarSetData>();

Hvilket så vil lade dig bruge det som en afhængighed i dine tjenester:

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

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

Et alternativ til at oprette din egen basisklasse er at arve fra den allerede eksisterende LogicBase-basisklasse, som allerede har IRedisClientsManager ejendom og over kedelplade.




  1. Hvad er MongoDB batch operation max størrelse?

  2. Auto-genereret felt til MongoDB ved hjælp af Spring Boot

  3. Afinstaller mongoDB fra ubuntu

  4. Implementering og vedligeholdelse af MongoDB ved hjælp af Ansible