Node.js &复述:
我有一个LIST (users:waiting)存储等待加入游戏的用户队列。
我有SORTED SET (games:waiting)等待用户的游戏。每隔30秒,服务器就会更新一个新的日期。这样我就可以确保如果服务器崩溃,游戏不再被使用。如果服务器正在运行并且已填满,它将从排序集中删除自己。
每个游戏都有一个SET (game:id:users),包含其中的用户。每场比赛不超过6人。
多个服务器正在使用BRPOP从LIST中获取用户(users:waiting)。
一旦服务器有了用户id,它就会获得等待的游戏id,然后继续在他们的游戏上运行SCARD:id:users SET。如果结果小于6,则将它们添加到集合中。
问题:
如果多个服务器同时这样做,我们最终可能会有超过6个用户被添加到一个集合中。例如,如果一个服务器请求SCARD,紧接着另一个服务器运行SADD,集合中的数量会增加,但是第一个服务器不会知道。
有没有办法防止这种情况发生?
你需要redis支持的事务:http://redis.io/topics/transactions
,特别是在您的情况下,您要注意watch命令:http://redis.io/topics/transactions#cas