问题标签 [redlock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
788 浏览

node.js - 使用 Redis 事务 vs redlock 解决丢失更新问题

我正在使用具有 2 个以上节点的 Redis 集群。我试图找出最适合处理并发的工具 - 事务或锁定。事务有据可查,但我没有找到关于 redlock 的最佳最佳实践示例。我还想知道为什么存在两种工具以及每种工具的用例是什么。

为简单起见,假设我想做一个并发增量,并且 Redis 中没有 INCR 命令。

选项 1.使用事务

如果我理解正确,NodeJS 伪代码将如下所示:

transactIncrement = async (key) => { await redisClient.watch(key); 让值 = redisClient.get(key); 价值 = 价值 + 1;const multi = await redisClient.multi(); 尝试 { 等待 redisClient.set(key, value, multi); 等待 redisClient.exec(multi); } catch (e) { // 很可能是由于事务失败而引发的错误 // TODO: 考虑是否在每种情况下都重新启动是个好主意,从而引入潜在的无限循环 // 不管怎样,重新启动 await transactIncrement(key); } }

我在上面看到的坏事是:

  • 尝试捕获块
  • 在 redis 集群上使用具有多个键的事务的可能性受到限制

选项 2.红锁

尝试锁定已经锁定的资源是否不会立即导致失败?那么redlock会在出错之前尝试N次吗?

如果为真,那么这是我的伪代码:

概括

如果我做对了,那么 redlock 绝对是一种更强大的技术。如果我在上述假设中错了,请纠正我。如果有人提供解决类似问题的代码示例,那也很棒,因为我找不到。

0 投票
1 回答
401 浏览

node.js - 如果资源已经被锁定会发生什么?

我正在尝试使用 RedLock 来防止 2 个用户同时对同一资源进行操作(彼此预订的东西太快)。但是,如果资源已被其他人获取,我希望它完全失败(在请求提交事务后预订可用性将消失)。我不清楚在文档中如果资源仍然被锁定会发生什么以及此时如何失败。它只是抛出一个错误吗?https://github.com/mike-marcacci/node-redlock#usage-promise-style

0 投票
1 回答
124 浏览

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

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

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

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

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

0 投票
0 回答
146 浏览

ruby-on-rails - Sidekiq / Ruby On Rails - 使用 Redis (Redlock) 锁定未正确锁定

我正在尝试使用 Redis 和Redlock library锁定我的部分代码。

我在这里实现了它:

同时运行多个 Sidekiq 作业时,我得到的是以下日志:

当我的两个不应该一起执行的 520 任务以 1ms 的差异被调用时,就会发生这种情况。

然而,有时锁会按预期工作。

我检查了 Redis,它工作得很好。

有任何想法吗?谢谢!

0 投票
0 回答
56 浏览

node.js - 节点:获取锁一直等待redis在60分钟内重新连接

我正在使用 Redlock node.js 但遇到 1 个问题。我只有 1 个 Redis 实例,默认连接超时时间为 60 分钟。因此,如果我在 Redis 关闭时尝试获取锁,Redlock 会一直等待 60 分钟。我已经检查了文档,但获取锁定的时间有限。

这是创建锁的代码块:

以及获取锁的代码: