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

StackExchange.Redis ConnectionMultiplexer pula dla metod synchronicznych

Myślę, że się tutaj mylisz. ConnectionMultiplexer nie "blokuje się". Tworzenie ConnectionMultiplexer daje ci obiekt przypominający fabrykę, za pomocą którego możesz utworzyć IDatabase instancje. Następnie używasz tych wystąpień do wykonywania normalnych zapytań Redis. Możesz także wykonywać zapytania Redis za pomocą samego multipleksera połączenia, ale są to zapytania serwera i raczej nie będą wykonywane często.
W skrócie, może ogromnie pomóc mieć pulę multiplekserów połączeń, niezależnie od synchronizacji /async/mieszane użycie.

Aby dalej rozwinąć, oto bardzo prosta implementacja puli, którą z pewnością można jeszcze bardziej ulepszyć:

public interface IConnectionMultiplexerPool
{
    Task<IDatabase> GetDatabaseAsync();
}

public class ConnectionMultiplexerPool : IConnectionMultiplexerPool
{
    private readonly ConnectionMultiplexer[] _pool;
    private readonly ConfigurationOptions _redisConfigurationOptions;

    public ConnectionMultiplexerPool(int poolSize, string connectionString) : this(poolSize, ConfigurationOptions.Parse(connectionString))
    {
    }

    public ConnectionMultiplexerPool(int poolSize, ConfigurationOptions redisConfigurationOptions)
    {
        _pool = new ConnectionMultiplexer[poolSize];
        _redisConfigurationOptions = redisConfigurationOptions;
    }

    public async Task<IDatabase> GetDatabaseAsync()
    {
        var leastPendingTasks = long.MaxValue;
        IDatabase leastPendingDatabase = null;

        for (int i = 0; i < _pool.Length; i++)
        {
            var connection = _pool[i];

            if (connection == null)
            {
                _pool[i] = await ConnectionMultiplexer.ConnectAsync(_redisConfigurationOptions);

                return _pool[i].GetDatabase();
            }

            var pending = connection.GetCounters().TotalOutstanding;

            if (pending < leastPendingTasks)
            {
                leastPendingTasks = pending;
                leastPendingDatabase = connection.GetDatabase();
            }
        }

        return leastPendingDatabase;
    }
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Skanowanie redis zwraca puste wyniki, ale kursor niezerowy

  2. Czy „StackExchange.Redis.ConnectionMultiplexer” powinien być „AddSingleton” czy „AddScope” w iniekcji zależności .NET Core?

  3. Jaka jest różnica między metodą HSET a HMSET w bazie danych redis

  4. Łączenie z Redis To Go za pomocą PHP

  5. Redis/Jedis brak pojedynczego punktu awarii i automatyczne przełączanie awaryjne