StackExchange.Redis ConnectionMultiplexer pool for synchronous methods(StackExchange.Redis连接用于同步方法的多路复用器池)
问题描述
如果我们将ConnectionMultiplexer池用于同步方法,实现ConnectionMultiplexer池是否有意义? 因此,我所说的池是指创建StackExchange.Redis ConnectionMultiplexer的多个实例,存储这些对象,当我想要与Redis服务器通信时,我从池中获取使用最少的一个。这是为了防止根据本文第10条建议:https://azure.microsoft.com/en-us/blog/investigating-timeout-exceptions-in-stackexchange-redis-for-azure-redis-cache/
由于队列太大而超时我有疑问,因为我不确定如果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;
}
}
这篇关于StackExchange.Redis连接用于同步方法的多路复用器池的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:StackExchange.Redis连接用于同步方法的多路复用器池


- MoreLinq maxBy vs LINQ max + where 2022-01-01
- C# 中多线程网络服务器的模式 2022-01-01
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- 如何用自己压缩一个 IEnumerable 2022-01-01
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- 输入按键事件处理程序 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01