Redis
 sql >> база данни >  >> NoSQL >> Redis

StackExchange.Redis ConnectionMultiplexer пул за синхронни методи

Мисля, че се бъркаш тук. ConnectionMultiplexer не се "блокира". Създаване на ConnectionMultiplexer ви дава фабричен обект, с който можете да създадете IDatabase случаи. След това използвате тези екземпляри, за да изпълнявате нормални заявки за Redis. Можете също да правите заявки за Redis със самия мултиплексор за връзка, но това са заявки към сървъра и е малко вероятно да се правят често.
Така че, за да направим нещата накратко, може да помогне изключително много да имате набор от мултиплексори за свързване, независимо от синхронизирането /асинхронно/смесено използване.

За да разширите допълнително, ето една много проста реализация на пул, която със сигурност може да бъде подобрена допълнително:

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. Каква единица се използва за показване на използването на процесора Redis

  2. Как Redis постига висока производителност и производителност?

  3. Автоматично довършване на Redis

  4. Влияе ли дължината на името на производителността в Redis?

  5. Съхранение на свойствата на обекта в redis