我正在尝试使用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
始终相同,因此不应为第二个进程获取锁定。