簡體   English   中英

用於同步方法的 StackExchange.Redis ConnectionMultiplexer 池

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM