Redis
 sql >> Base de données >  >> NoSQL >> Redis

ServiceStack.Redis Impossible de lire le transport - BasicRedisClientManager

Vous ne devez pas détenir d'instances singleton de RedisClient ou IRedisTypedClient<BarSet> qui encapsulent tous deux une connexion TCP Redis non thread-safe. Vous pouvez à la place conserver des instances singleton de IRedisClientsManager - dont le but est de fournir une fabrique de clients Redis sécurisée pour les threads (comme un pool de connexions DB).

Si vous utilisez également ServiceStack Services, il est plus facile d'enregistrer les dépendances dans l'IOC de ServiceStack donc IRedisClientsManager peut être injecté comme n'importe quelle autre dépendance, par exemple dans AppHost.Configure() :

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

Cela vous permettra d'utiliser le base.Redis Propriété RedisClient dans vos services ServiceStack, par exemple :

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

Si vous utilisez base.Redis vous n'avez pas à supprimer explicitement le RedisClient car il est déjà automatiquement supprimé par le Service, c'est-à-dire :

public class Service
{
    ...

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

Vous pouvez également injecter IRedisClientsManager dans vos propres classes comme toute autre dépendance utilisant une propriété publique ou un argument de constructeur, par exemple :

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

Que vous pouvez ensuite enregistrer et connecter automatiquement dans l'IOC de ServiceStack avec :

container.RegisterAutoWired<RedisBarSetData>();

Ce qui vous permettra ensuite de l'utiliser comme dépendance dans vos Services :

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

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

Une alternative à la création de votre propre classe de base consiste à hériter de la classe de base LogicBase préexistante, qui a déjà IRedisClientsManager propriété et ci-dessus passe-partout.