我是否应该始终与Redis具有相同的连接,才能使用RedLock.net处理分布式锁?

时间:2019-05-13 14:02:17

标签: c# .net redis stackexchange.redis redlock.net

我正在尝试使用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。但是有时我会看到一个问题,即锁不起作用,导致不同的进程可以同时访问同一密钥(第一个进程未完成时,一个进程可以获取同一项的锁,第二个进程可以获取同一项的锁)。 / p>

func中,我从缓存中获取数据并对其进行更新。


LockDistributedKey始终相同,因此不应为第二个进程获取锁定。

0 个答案:

没有答案