[英]StackExchange.Redis ConnectionMultiplexer life cycle management in web scenario
[英]StackExchange.Redis ConnectionMultiplexer pool for synchronous methods
如果我們將它用於同步方法,實現 ConnectionMultiplexer 池是否有意義?
因此,池我的意思是創建 StackExchange.Redis ConnectionMultiplexer 的多個實例,存儲這些對象,當我想與 Redis 服務器通信時,我從池中取出最少使用的一個。 這是為了防止根據本文第 10 條建議由於大隊列大小而超時: https : //azure.microsoft.com/en-us/blog/investigating-timeout-exceptions-in-stackexchange-redis-for- azure-redis-緩存/
我有疑問,因為我不確定如果 connectionMultiplexer 阻塞線程直到調用返回,隊列怎么會發生。
在我看來,使用同步方法調用池是沒有意義的,但是 Redis 最佳實踐文章建議創建這種池,而不管方法類型(同步/異步)
我想你在這里感到困惑。 ConnectionMultiplexer
不會“被阻止”。 創建ConnectionMultiplexer
為您提供了一個類似工廠的對象,您可以使用它創建IDatabase
實例。 然后,您可以使用這些實例來執行普通的 Redis 查詢。 您也可以使用連接多路復用器本身進行 Redis 查詢,但這些是服務器查詢,不太可能經常進行。
因此,簡而言之,無論同步/異步/混合使用如何,擁有一個連接多路復用器池都會有很大幫助。
為了進一步擴展,這是一個非常簡單的池實現,當然可以進一步增強:
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.