Myslím, že se tady pleteš. ConnectionMultiplexer
se „nezablokuje“. Vytvoření ConnectionMultiplexer
vám dává objekt podobný továrně, se kterým můžete vytvořit IDatabase
instance. Tyto instance pak použijete k provádění běžných dotazů Redis. Můžete také provádět dotazy Redis pomocí samotného multiplexeru připojení, ale to jsou dotazy serveru a je nepravděpodobné, že se budou provádět často.
Takže, abych to zkrátil, může nesmírně pomoci mít fond multiplexerů připojení bez ohledu na synchronizaci /async/mixed use.
Pro další rozšíření je zde velmi jednoduchá implementace fondu, kterou lze jistě dále vylepšit:
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;
}
}