Мисля, че се бъркаш тук. 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;
}
}