仅当SCARD低于某个值时才会出现SADD

时间:2013-03-02 08:45:28

标签: redis atomic multiplayer

Node.js& Redis的:

我有一个LIST(用户:等待)存储等待加入游戏的用户队列。

我有SORTED SET(游戏:等待)等待用户的游戏。这是由服务器每30秒更新一次,具有新的日期。这样我可以确保如果服务器崩溃,则不再使用游戏。如果服务器正在运行并填满,它将从已排序的集合中删除它自己。

每个游戏都有一个SET(游戏:id:用户),其中包含其中的用户。每场比赛只能接受6名球员。

多个服务器正在使用BRPOP从LIST中获取用户(用户:等待)。

一旦服务器拥有用户ID,它就会获得等待的游戏ID,然后继续在他们的游戏上运行SCARD:id:users SET。如果结果小于6,则将它们添加到集合中。

问题:

如果多个服务器同时执行此操作,我们最终可能会有超过6个用户一次添加到一个集合中。例如,如果一个服务器请求SCARD并且紧接着另一个服务器运行SADD,则该集合中的数字将增加,但第一个服务器将不知道。

有没有阻止这个?

1 个答案:

答案 0 :(得分:3)

您需要redis支持的交易:http://redis.io/topics/transactions

特别是在您的情况下,您需要注意watch命令:http://redis.io/topics/transactions#cas