ここで混乱していると思います。 ConnectionMultiplexer
「ブロック」されません。 ConnectionMultiplexer
の作成 IDatabase
を作成できる工場のようなオブジェクトを提供します インスタンス。次に、これらのインスタンスを使用して、通常のRedisクエリを実行します。接続マルチプレクサ自体を使用してRedisクエリを実行することもできますが、これらはサーバークエリであり、頻繁に実行される可能性は低いです。
したがって、簡単に言うと、同期に関係なく、接続マルチプレクサのプールを用意すると非常に役立ちます。 / async/mixedusage。
さらに拡張するために、ここに非常に単純なプールの実装があります。これは確かにさらに拡張できます:
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;
}
}