C# 分布式锁无法与RedLock.net一起使用
我想使用Redis进行分布式锁定。我正在使用nuget软件包。 但是线程能够获得锁,即使另一个线程已经获得了锁 以下是示例代码:C# 分布式锁无法与RedLock.net一起使用,c#,asp.net-core,redis,stackexchange.redis,redlock.net,C#,Asp.net Core,Redis,Stackexchange.redis,Redlock.net,我想使用Redis进行分布式锁定。我正在使用nuget软件包。 但是线程能够获得锁,即使另一个线程已经获得了锁 以下是示例代码: public void Demo(RedLockFactory redLockFactory) { Parallel.For(0, 5, x => { TimeSpan expiry = TimeSpan.FromSeconds(30);
public void Demo(RedLockFactory redLockFactory)
{
Parallel.For(0, 5, x =>
{
TimeSpan expiry = TimeSpan.FromSeconds(30);
var wait = TimeSpan.FromSeconds(10);
var retry = TimeSpan.FromSeconds(1);
string user = $"User:{x}";
using (var redLock = redLockFactory.CreateLock(resource, expiry, wait, retry))
{
// make sure we got the lock
if (redLock.IsAcquired)
{
Console.WriteLine($"{user} acquired lock at {DateTimeOffset.Now.ToString("dd-MM-yyyy HH:mm:ss")}.");
}
else
{
Console.WriteLine($"{user} didn't get the lock.");
}
}
});
}
这是我的演示的输出
User:4 acquired lock at 06-10-2020 09:24:34.
User:2 acquired lock at 06-10-2020 09:24:34.
User:1 acquired lock at 06-10-2020 09:24:34.
User:0 acquired lock at 06-10-2020 09:24:35.
User:3 acquired lock at 06-10-2020 09:24:35.
正如您所看到的,每个线程都能够获得锁,这是不应该发生的
一旦获得了锁,那么其他线程将无法获得锁。根据,“锁将在使用块结束时自动释放”
因此,我认为在您的演示输出中发生的是:
- 将“获取的锁”写入控制台
- 使用块从
中通过,释放其锁(现在另一个线程可以获胜)
如果您想看到锁获取失败,请在退出
之前使用
块执行非常缓慢的操作(>10秒)。出于演示目的,您可以在写入“acquired”行之后Thread.Sleep(15000)
。然后我认为,它不符合分布式锁的定义。如果我的应用程序有多个实例,那么所有线程都可以同时获得锁。一次只有一个线程成功地获得资源上的锁。在您的演示中,线程碰巧都是本地的,但是如果线程分布在多个实例上,您会看到相同的行为。更多信息:当您调用CreateLock时,会从Redis服务器组的仲裁中获得一个锁。(请参阅)退出using块时,C#调用redLock.Dispose()
,并在Redis服务器上释放锁。(见附件)