Saya pikir Anda mulai bingung di sini. ConnectionMultiplexer
tidak "diblokir". Membuat ConnectionMultiplexer
memberi Anda objek seperti pabrik yang dengannya Anda dapat membuat IDatabase
contoh. Anda kemudian menggunakan contoh ini untuk melakukan kueri Redis normal. Anda juga dapat melakukan kueri Redis dengan multiplexer koneksi itu sendiri, tetapi itu adalah kueri server dan tidak mungkin sering dilakukan.
Jadi, untuk mempersingkat, memiliki kumpulan multiplexer koneksi dapat sangat membantu, terlepas dari sinkronisasi /async/penggunaan campuran.
Untuk memperluas lebih jauh, inilah implementasi kumpulan yang sangat sederhana, yang tentunya dapat ditingkatkan lebih lanjut:
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;
}
}