sql >> Database >  >> NoSQL >> Redis

ServiceStack.Redis Kan transport niet lezen - BasicRedisClientManager

U mag geen enkele instantie van RedisClient hebben of IRedisTypedClient<BarSet> die beide een niet-thread-veilige Redis TCP-verbinding inkapselen. U kunt in plaats daarvan singleton-instanties van IRedisClientsManager - wat het doel is om een ​​thread-safe Redis Client Factory te bieden (zoals een DB Connection Pool).

Als u ook ServiceStack Services gebruikt, is het gemakkelijker om afhankelijkheden te registreren in het IOC van ServiceStack, dus IRedisClientsManager kan worden geïnjecteerd zoals elke andere afhankelijkheid, bijvoorbeeld in AppHost.Configure() :

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

Hiermee kunt u de base.Redis . gebruiken RedisClient-eigenschap in uw ServiceStack Services, bijvoorbeeld:

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

Als u base.Redis . gebruikt u hoeft de RedisClient niet expliciet te verwijderen, aangezien deze al automatisch wordt verwijderd door de Service, d.w.z.:

public class Service
{
    ...

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

U kunt ook IRedisClientsManager . injecteren in uw eigen klassen zoals elke andere afhankelijkheid met behulp van een openbare eigenschap of Constructor-argument, bijvoorbeeld:

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 u vervolgens kunt registreren en autowiren in ServiceStack's IOC met:

container.RegisterAutoWired<RedisBarSetData>();

Waardoor je het dan als een afhankelijkheid in je Services kunt gebruiken:

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

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

Een alternatief voor het maken van uw eigen basisklasse is om te erven van de reeds bestaande LogicBase-basisklasse, die al IRedisClientsManager heeft. eigendom en boven boilerplate.




  1. MongoDB als Windows-service en replicaSet instellen

  2. Fout tijdens het uitvoeren van het Lua-script vanuit de redis-client

  3. Rails hoe te zien of een sidekiq-werker klaar is met perform_async

  4. Hoe kan ik deze gedistribueerde wachtrij met één gelijktijdigheid implementeren in elk MQ-platform?