分布式锁无法与redlock.net一起使用

bkkx9g8r  于 2021-06-08  发布在  Redis
关注(0)|答案(1)|浏览(519)

我想用redis来实现分布式锁。我正在为此使用redlock.net 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.

如您所见,每个线程都能够获得锁,这是不应该发生的。
一旦获得了锁,那么其他线程就不能获得锁。

fjnneemd

fjnneemd1#

根据redlock.net/readme.md,“在使用块结束时自动释放锁”。
所以我认为在你的演示输出中发生的是:
五个线程并行启动,每个线程都试图锁定同一资源。
线程4获胜(成功获得锁)并执行以下操作:;同时,其他线程等待(最多10秒):
将“获取的锁”写入控制台
昏倒在地 using 阻塞,释放锁(现在另一个线程可以赢)
线程2获胜,并在其余线程等待时执行相同的操作。
线程1、0和3也是如此。
每个线程的工作都很快,因此没有一个线程不能在10秒内获得锁。
如果希望看到锁获取失败,请在退出前执行非常缓慢的操作(>10秒) using 阻止。出于演示目的,您可以 Thread.Sleep(15000) 在写了“获得”一行之后。

相关问题