是否可以将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:请用代码发布你的答案,这是最好的方法:)
答案 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不同,它还具有永远不会失败的好处,您必须检查失败并在失败时再次运行查询。