Должен ли я всегда иметь одно и то же соединение с Redis для работы с распределенной блокировкой, используя RedLock.net? - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь использовать RedLock.net в качестве реализации распределенной блокировки для Redis.

Для каждого запроса к Redis я пытаюсь получить доступное подключение к кластеру Redis из пула подключений.

Итак, у меня есть что-то вроде:

public async Task<bool> LockActionAsync(Func<Task<bool>> func)
{
    var retValue = true;
    using (var connection = this.PooledConnection)
    {
        var multiplexers = new[] { connection.Value }.Select(obj => new RedLockMultiplexer(obj)).ToList();

        using (var redlockFactory = RedLockFactory.Create(multiplexers))
        {
            using (var redLock = await redlockFactory.CreateLockAsync(
                LockDistributedKey,
                this.lockExpirySpan,
                this.lockWaitSpan,
                this.lockRetrySpan))
            {
                if (redLock.IsAcquired)
                {
                    retValue = await func();
                }
            }
        }
    }

    return retValue;
}

Итак, я беру соединение с Redis и создаю RedLockFactory базу на этом соединении. Но иногда я вижу проблему, когда блокировка не работает, потому что разные процессы могут иметь доступ к одному и тому же ключу одновременно (один процесс получает блокировку, а второй может получить блокировку для одного и того же элемента, пока 1-й не завершен).

В func Я получаю данные из кэша и обновляю их.


LockDistributedKey всегда одинаков, поэтому блокировку не следует устанавливать для второго процесса.

...