1

Node.js 和 Redis:

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

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

每个游戏都有一个包含其中用户的 SET (game:id:users)。每场比赛最多可容纳 6 名玩家。

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

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

问题:

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

有没有办法阻止这种情况?

4

1 回答 1

3

你需要redis支持的事务:http ://redis.io/topics/transactions

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

于 2013-03-02T08:50:00.977 回答