StackExchange.Redis连接用于同步方法的多路复用器池

StackExchange.Redis ConnectionMultiplexer pool for synchronous methods(StackExchange.Redis连接用于同步方法的多路复用器池)
本文介绍了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连接用于同步方法的多路复用器池的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
quot;Overflowquot; compiler error with -9223372036854775808L(编译器错误-9223372036854775808L(Q;溢出Q))
Visual Studio 2010 ReportViewer Assembly References(Visual Studio 2010 ReportViewer程序集引用)
Weird behaviour when I open a reportviewer in WPF(在WPF中打开报表查看器时出现奇怪的行为)
how do i pass parameters to aspnet reportviewer(如何将参数传递给aspnet report查看器)