sql >> Databáze >  >> NoSQL >> Redis

StackExchange.Redis ConnectionMultiplexer pool pro synchronní metody

Myslím, že se tady pleteš. ConnectionMultiplexer se „nezablokuje“. Vytvoření ConnectionMultiplexer vám dává objekt podobný továrně, se kterým můžete vytvořit IDatabase instance. Tyto instance pak použijete k provádění běžných dotazů Redis. Můžete také provádět dotazy Redis pomocí samotného multiplexeru připojení, ale to jsou dotazy serveru a je nepravděpodobné, že se budou provádět často.
Takže, abych to zkrátil, může nesmírně pomoci mít fond multiplexerů připojení bez ohledu na synchronizaci /async/mixed use.

Pro další rozšíření je zde velmi jednoduchá implementace fondu, kterou lze jistě dále vylepšit:

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;
    }
}



  1. Odeberte všechna pole, která mají hodnotu null

  2. přidejte pole created_at a updated_at do schémat mongoose

  3. Komunikace mezi dvěma kontejnery Docker na macOS 10.12

  4. Jak provádět operace aktualizace v GridFS (pomocí Javy)?