Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分布式锁无法与RedLock.net一起使用_C#_Asp.net Core_Redis_Stackexchange.redis_Redlock.net - Fatal编程技术网

C# 分布式锁无法与RedLock.net一起使用

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);

我想使用Redis进行分布式锁定。我正在使用nuget软件包。 但是线程能够获得锁,即使另一个线程已经获得了锁

以下是示例代码:

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.
正如您所看到的,每个线程都能够获得锁,这是不应该发生的

一旦获得了锁,那么其他线程将无法获得锁。

根据,“锁将在使用块结束时自动释放”

因此,我认为在您的演示输出中发生的是:

  • 五个线程并行启动,每个线程都试图锁定同一资源
  • 线程4获胜(成功获取其锁)并执行以下操作:;同时,其他线程等待(最多10秒):
    • 将“获取的锁”写入控制台
    • 使用块从
      中通过,释放其锁(现在另一个线程可以获胜)
  • 线程2获胜,并在其余线程等待时执行相同的操作
  • 线程1、0和3也是如此
  • 每个线程的工作都很快,因此没有线程在10秒内无法获得锁

  • 如果您想看到锁获取失败,请在退出
    之前使用
    块执行非常缓慢的操作(>10秒)。出于演示目的,您可以在写入“acquired”行之后
    Thread.Sleep(15000)

    然后我认为,它不符合分布式锁的定义。如果我的应用程序有多个实例,那么所有线程都可以同时获得锁。一次只有一个线程成功地获得资源上的锁。在您的演示中,线程碰巧都是本地的,但是如果线程分布在多个实例上,您会看到相同的行为。更多信息:当您调用CreateLock时,会从Redis服务器组的仲裁中获得一个锁。(请参阅)退出using块时,C#调用
    redLock.Dispose()
    ,并在Redis服务器上释放锁。(见附件)