मुझे लगता है कि आप यहाँ भ्रमित हो रहे हैं। ConnectionMultiplexer
"अवरुद्ध" नहीं होता है। एक ConnectionMultiplexer
बनाना आपको फ़ैक्टरी जैसी वस्तु देता है जिससे आप IDatabase
. बना सकते हैं उदाहरण। फिर आप इन उदाहरणों का उपयोग सामान्य रेडिस प्रश्नों को करने के लिए करते हैं। आप कनेक्शन मल्टीप्लेक्सर के साथ रेडिस क्वेरी भी कर सकते हैं, लेकिन वे सर्वर क्वेरी हैं और अक्सर किए जाने की संभावना नहीं है। /async/मिश्रित उपयोग।
आगे विस्तार करने के लिए, यहां एक बहुत ही सरल पूल कार्यान्वयन है, जिसे निश्चित रूप से और बढ़ाया जा सकता है:
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;
}
}