asp.net - StackExchange.Redis ConnectionMultiplexer 池用于同步方法
问题描述
如果我们将它用于同步方法,实现 ConnectionMultiplexer 池是否有意义?
因此,池是指创建 StackExchange.Redis ConnectionMultiplexer 的多个实例,存储这些对象,当我想与 Redis 服务器通信时,我会从池中取出最少使用的一个。这是为了根据本文中的第 10 条建议防止由于队列大小过大而导致超时:https ://azure.microsoft.com/en-us/blog/investigating-timeout-exceptions-in-stackexchange-redis-for-天蓝色redis缓存/
我有疑问,因为我不确定如果 connectionMultiplexer 阻塞线程直到调用返回,队列怎么会发生。
在我看来,拥有一个池对于同步方法调用毫无意义,但 Redis 最佳实践文章建议创建这种池,无论方法类型如何(同步/异步)
解决方案
我想你在这里感到困惑。ConnectionMultiplexer
不会“被阻止”。创建 aConnectionMultiplexer
为您提供了一个类似工厂的对象,您可以使用该对象创建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;
}
}
推荐阅读
- ansible - 关于使用 Ansible 更新包的问题
- java - 使用字符串而不是 java.lang.charsequence
- scala - 在 Spark 中找到最长的连续条纹
- c++ - 两个函数如何在时间复杂度问题上彼此不同
- firebase - 如何在flutter应用程序中将文本/文件数据存储/检索到firebase数据库
- batch-file - 批处理脚本错误级别输出未显示预期输出
- javascript - 将pdf转换为图像:角度8
- sql - SQL Plus 列溢出到下一行
- javascript - push() 日期的二维数组
- c++ - 无法在 IB API C++ 中获取历史数据