Tôi nghĩ bạn đang bối rối ở đây. ConnectionMultiplexer
không "bị chặn". Tạo ConnectionMultiplexer
cung cấp cho bạn một đối tượng giống như nhà máy để bạn có thể tạo IDatabase
các trường hợp. Sau đó, bạn sử dụng các phiên bản này để thực hiện các truy vấn Redis bình thường. Bạn cũng có thể thực hiện các truy vấn Redis bằng chính bộ ghép kênh kết nối, nhưng đó là các truy vấn máy chủ và không có khả năng được thực hiện thường xuyên.
Vì vậy, nói ngắn gọn, việc có một nhóm bộ ghép kênh kết nối có thể giúp ích rất nhiều, bất kể đồng bộ hóa. / async / sử dụng hỗn hợp.
Để mở rộng hơn nữa, đây là cách triển khai nhóm rất đơn giản, chắc chắn có thể được nâng cao hơn nữa:
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;
}
}