Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Nhóm StackExchange.Redis ConnectionMultiplexer cho các phương thức đồng bộ

Tôi nghĩ bạn đang bối rối ở đây. ConnectionMultiplexer không "bị chặn". Tạo ConnectionMultiplexer cung cấp cho bạn một đối tượng giống như nhà máy để bạn có thể tạo IDatabase các trường hợp. Sau đó, bạn sử dụng các phiên bản này để thực hiện các truy vấn Redis bình thường. Bạn cũng có thể thực hiện các truy vấn Redis bằng chính bộ ghép kênh kết nối, nhưng đó là các truy vấn máy chủ và không có khả năng được thực hiện thường xuyên.
Vì vậy, nói ngắn gọn, việc có một nhóm bộ ghép kênh kết nối có thể giúp ích rất nhiều, bất kể đồng bộ hóa. / async / sử dụng hỗn hợp.

Để mở rộng hơn nữa, đây là cách triển khai nhóm rất đơn giản, chắc chắn có thể được nâng cao hơn nữa:

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Hiệu suất của Redis vs Disk trong ứng dụng bộ nhớ đệm

  2. redis lua script so với các cuộc gọi đơn lẻ

  3. Lọc các phần tử trong Redis

  4. Redis Hash Pagination

  5. Làm cách nào để gỡ lỗi lệnh OOM không được phép khi sử dụng bộ nhớ> 'maxmemory' trong Redis?