我正在使用具有 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次吗?
如果为真,那么这是我的伪代码:
redlockIncrement = async (key) => {
await redlock.lock(key, 1);
// below this line it's guaranteed that other "threads" are put on hold
// and cannot access the key, right?
let value = await redisClient.get(key);
value = value + 1;
await redisClient.set(key, value);
await redlock.unlock(key);
}
概括
如果我做对了,那么 redlock 绝对是一种更强大的技术。如果我在上述假设中错了,请纠正我。如果有人提供解决类似问题的代码示例,那也很棒,因为我找不到。