如何为 RedLockFactory.CreateLockAsync() 方法的 expiryTime 参数选择正确的值?

How to choose the right value for the expiryTime parameter for RedLockFactory.CreateLockAsync() method?

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

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

我知道此方法将通过每隔 retryTime 重试一次来尝试获取 waitTime 的锁。但是我不明白 expiryTime 的正确值是多少。 一旦获得锁,它将一直保留到锁为 Disposed 为止,这与 expiryTime 无关。换句话说,即使 expirtyTime 设置为 5 秒,如果锁仅在 10 秒后被释放,那么锁将保留 10 秒。

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

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

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

例如

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

  • 自动续锁定时器会每隔5分钟(过期时间/2)调用redis来延长锁
  • 如果您的进程在未释放锁的情况下崩溃,您最多需要等待 10 分钟,直到密钥在 Redis 中过期并且另一个进程可以取出对同一资源的锁

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

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

这是在发生故障时您愿意等待锁过期的时间与您对 redis 服务器施加的负载之间的平衡。