sql >> データベース >  >> NoSQL >> Redis

同期メソッド用のStackExchange.RedisConnectionMultiplexerプール

    ここで混乱していると思います。 ConnectionMultiplexer 「ブロック」されません。 ConnectionMultiplexerの作成 IDatabaseを作成できる工場のようなオブジェクトを提供します インスタンス。次に、これらのインスタンスを使用して、通常のRedisクエリを実行します。接続マルチプレクサ自体を使用してRedisクエリを実行することもできますが、これらはサーバークエリであり、頻繁に実行される可能性は低いです。
    したがって、簡単に言うと、同期に関係なく、接続マルチプレクサのプールを用意すると非常に役立ちます。 / async/mixedusage。

    さらに拡張するために、ここに非常に単純なプールの実装があります。これは確かにさらに拡張できます:

    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. Laravel5.1セッションとSocket.IO+Redis-ログインした(既知の)ユーザーとユーザーのグループに通知を送信する

    2. SpringDataMongoDBトランザクション

    3. mongodbは検索クエリで文字列として_idを取得します

    4. ClusterControlAdvisorsを使用したMongoDBの監視と保護