Я пытаюсь использовать 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
всегда одинаков, поэтому блокировку не следует устанавливать для второго процесса.