Node.js& Redis的:
我有一个LIST(用户:等待)存储等待加入游戏的用户队列。
我有SORTED SET(游戏:等待)等待用户的游戏。这是由服务器每30秒更新一次,具有新的日期。这样我可以确保如果服务器崩溃,则不再使用游戏。如果服务器正在运行并填满,它将从已排序的集合中删除它自己。
每个游戏都有一个SET(游戏:id:用户),其中包含其中的用户。每场比赛只能接受6名球员。
多个服务器正在使用BRPOP从LIST中获取用户(用户:等待)。
一旦服务器拥有用户ID,它就会获得等待的游戏ID,然后继续在他们的游戏上运行SCARD:id:users SET。如果结果小于6,则将它们添加到集合中。
问题:
如果多个服务器同时执行此操作,我们最终可能会有超过6个用户一次添加到一个集合中。例如,如果一个服务器请求SCARD并且紧接着另一个服务器运行SADD,则该集合中的数字将增加,但第一个服务器将不知道。
有没有阻止这个?
答案 0 :(得分:3)
您需要redis支持的交易:http://redis.io/topics/transactions
特别是在您的情况下,您需要注意watch命令:http://redis.io/topics/transactions#cas