c# - 分布式锁不适用于RedLock.net

标签 c# asp.net-core redis stackexchange.redis redlock.net

我想使用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.
如您所见,每个线程都可以获取锁,这是不应该发生的。
一旦获取了锁,则其他线程应该无法获取该锁。

最佳答案

对于RedLock.net/README.md,“该锁将在using块的结尾自动释放”。
所以我认为您的演示输出中发生的是:

  • 五个线程并行启动,每个线程都尝试对同一资源进行锁定。
  • 线程4获胜(成功获得其锁)并执行以下操作;同时,其他线程等待(最多10秒):
  • 将“获得的锁”写入控制台
  • using块中传递出去,释放其锁定(现在另一个线程可以胜出)

  • 线程2获胜,并且在其余线程等待时执行相同的操作。
  • 线程1、0和3的同上。
  • 每个线程都可以快速完成其工作,因此没有一个线程会在10秒内获取锁。

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

    关于c# - 分布式锁不适用于RedLock.net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64219151/

    相关文章:

    c# - 找不到类型或命名空间名称 'DefaultHttpRequest'

    node.js - 缓存数据库中的项目是否存在

    python - 是否有用于 Redis 的 Python 基于时间的计数器库?

    c# - 为自定义类型设置 DataView(或 DataTable.DefaultView)RowFilter

    c# - 使用 getJSON MVC4 C#/Jquery 从 Controller 动态加载选择列表

    javascript - asp.net 表单自动提交

    entity-framework - 使用 EF Core 记录查询持续时间

    asp.net-core - UseStatusCodePagesWithRedirects 和 UseStatusCodePagesWithReExecute 之间的区别 - Asp.net core 中的状态代码页

    与多个 redis 实例交互(存储/读取)的 Lua 脚本

    c# - 我应该在这里使用 ref 还是 out 关键字?