【发布时间】:2021-03-20 02:02:42
【问题描述】:
我正在使用具有 2 个以上节点的 Redis 集群。我试图找出最适合处理并发的工具 - 事务或锁定。事务是well documented,但我没有找到关于redlock 的最佳最佳实践示例。我还想知道为什么存在两种工具,每种工具的用例是什么。
为简单起见,假设我想做一个并发增量,而 Redis 中没有 INCR 命令。
选项 1。使用事务
如果我理解正确的话,NodeJS 伪代码应该是这样的:
transactIncrement = async (key) => { 等待 redisClient.watch(key); 让值 = redisClient.get(key); 价值 = 价值 + 1; const multi = await redisClient.multi(); 尝试 { 等待 redisClient.set(key, value, multi); 等待 redisClient.exec(multi); } 抓住 (e) { // 很可能是因为事务失败而抛出的错误 // TODO: 考虑是否在每种情况下都重新启动是个好主意,这会引入潜在的无限循环 // 不管怎样,重启 等待交易增量(键); } }
我在上面看到的坏事是:
- try-catch 块
- 在 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 绝对是一种更强大的技术。如果我在上述假设中错了,请纠正我。如果有人提供解决类似问题的代码示例,那也很棒,因为我找不到。
【问题讨论】:
标签: node.js redis concurrency redlock