Redis - 在事务中使用Incr值

时间:2015-04-20 20:38:23

标签: node.js transactions redis

是否可以将multi.incr(value)multi.hmset一起使用?

我的意思是:

var name = 'Josh';
var multi = client.multi();
multi.incr('id'); // incr => 1
multi.hmset('user:' + <need incr value here>, 'username', name);
// I want multi.hmset('user:1', 'username', 'Josh');
multi.exec(function(err,data){ .. });

我的目标是增加'id',然后将其设置为事务中的用户ID。我已经读过,我需要做client.watch('id'),但我不明白如何使用它。

PD:请用代码发布你的答案,这是最好的方法:)

1 个答案:

答案 0 :(得分:18)

上面接受的答案是不必要的复杂。在这种情况下,您无需使用多人或手表。 INCR已经是原子的,专为这种情况而设计。编辑:感谢Itamar Haber&amp; robe007用于获取已接受的答案。 :)

你可以这样做:

var name = 'Josh';
client.incr('id', function(err, id) {
    client.hmset('user:' + id, 'username', name);
});

通过以上操作,INCR会自动锁定&#34; id&#34;键,为您递增,解锁,然后将其返回给您。因此,任何人都无法使用上面的代码获得重复的用户ID。与WATCH / GET不同,它还具有永远不会失败的好处,您必须检查失败并在失败时再次运行查询。