首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于同步方法的StackExchange.Redis ConnectionMultiplexer池

用于同步方法的StackExchange.Redis ConnectionMultiplexer池
EN

Stack Overflow用户
提问于 2021-07-27 18:00:40
回答 1查看 3.2K关注 0票数 1

如果我们将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的最佳实践文章建议创建这种池,而不管方法类型(同步/异步)如何。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-27 18:07:45

我觉得你在这里搞糊涂了。ConnectionMultiplexer不会“被阻塞”。创建ConnectionMultiplexer为您提供了一个类似工厂的对象,您可以用它来创建IDatabase实例。然后使用这些实例执行普通的Redis查询。您也可以使用连接复用器本身执行Redis查询,但这是服务器查询,不太可能经常执行。

因此,为了缩短时间,无论同步/异步/混合使用,拥有一个连接多路复用器池都会有很大帮助。

为了进一步扩展,这里有一个非常简单的池实现,当然还可以进一步增强:

代码语言:javascript
复制
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;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68549760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档