0

我正在使用 RedLock.net 库进行资源锁定。为了锁定资源,我使用 RedLockFactory.CreateLockAsync。

public async Task<IRedLock> RedLockFactory.CreateLockAsync(string resource,
      TimeSpan expiryTime,
      TimeSpan waitTime,
      TimeSpan retryTime,
      CancellationToken? cancellationToken = null)

我了解此方法将尝试waitTime通过不断重试每个retryTime. 但是我不明白什么是正确的价值expiryTime。一旦获得了锁,它将一直保留到锁为Disposed 为止,这与expiryTime. 换句话说,即使expirtyTime设置为 5 秒,如果锁仅在 10 秒后被释放,那么锁将保持 10 秒。

在许多示例中,使用 30 的值没有说明。
我已经用 0 的值进行了测试。根本没有获得锁。
我已经用 5 毫秒的值进行了测试。获取并保留锁直到被释放。

那么如何为expiryTime参数选择合适的值呢?在我看来,这个参数是不必要的,任何非零正值都可以。

4

1 回答 1

1

ExpiryTime确定在失败的情况下(例如,持有锁的进程崩溃)持有锁的最长时间。它还间接确定了锁在被持有时更新的频率。

例如

如果您将到期时间设置为 10 分钟:

  • 自动锁更新定时器会每5分钟(到期时间/2)调用redis来延长锁
  • 如果您的进程在没有释放锁的情况下崩溃,您将不得不等待最多 10 分钟,直到密钥在 redis 中过期,并且另一个进程可以对同一资源进行锁定

如果您将到期时间设置为 10 毫秒:

  • 自动锁更新计时器将每 5 毫秒(到期时间/2)调用一次 redis 以延长锁(可能有点过分)
  • 如果您的进程在没有释放锁的情况下崩溃,您将不得不等待最多 10 毫秒,直到密钥在 redis 中过期,并且另一个进程可以在同一资源上获取锁

这是在失败情况下您愿意等待锁过期的时间与您在 Redis 服务器上施加的负载之间的平衡。

于 2021-08-20T22:34:45.250 回答