Redis
 sql >> Baza danych >  >> NoSQL >> Redis

ServiceStack.Redis Nie można odczytać transportu — BasicRedisClientManager

Nie powinieneś przechowywać żadnych pojedynczych wystąpień RedisClient lub IRedisTypedClient<BarSet> które zawierają niebezpieczne wątkowo połączenie TCP Redis. Zamiast tego możesz przechowywać pojedyncze instancje IRedisClientsManager - co ma na celu zapewnienie bezpiecznej wątkowo fabryki klientów Redis (takiej jak pula połączeń DB).

Jeśli używasz również usług ServiceStack, łatwiej jest zarejestrować zależności w IOC ServiceStack, więc IRedisClientsManager można wstrzyknąć jak każdą inną zależność, np. w AppHost.Configure() :

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

Umożliwi to użycie base.Redis Właściwość RedisClient w usługach ServiceStack, np.:

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

Jeśli używasz base.Redis nie musisz jawnie usuwać Klienta Redis, ponieważ jest on już automatycznie usuwany przez Usługę, tj.:

public class Service
{
    ...

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

Możesz także wstrzyknąć IRedisClientsManager do własnych klas, jak każda inna zależność przy użyciu właściwości publicznej lub argumentu Konstruktora, np.:

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

Które następnie możesz zarejestrować i automatycznie podłączyć w IOC ServiceStack za pomocą:

container.RegisterAutoWired<RedisBarSetData>();

Który następnie pozwoli ci użyć go jako zależności w twoich usługach:

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

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

Alternatywą dla tworzenia własnej klasy bazowej jest dziedziczenie z istniejącej wcześniej klasy bazowej LogicBase, która ma już IRedisClientsManager nieruchomości i powyżej kotła.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Czy dwa moduły powinny używać tego samego połączenia redis? (pracuję z Flask)

  2. Konsekwentne mieszanie jako sposób na skalowanie zapisów

  3. Przecięcie Mongodb z zakresem czasu

  4. Asynchroniczne interfejsy API Redis

  5. Jak usunąć zablokowanych/przestarzałych pracowników Resque?