1

Node.js & Redis:

ゲームに参加するのを待っているユーザーのキューを保存する LIST (users:waiting) があります。

ユーザーを待っているゲームの SORTED SET (games:waiting) があります。これは、新しい日付で 30 秒ごとにサーバーによって更新されます。このようにして、サーバーがクラッシュした場合にゲームが使用されなくなることを確認できます。サーバーが稼働中に満杯になると、ソート済みセットからサーバー自体が削除されます。

各ゲームには、その中にいるユーザーを含む SET (game:id:users) があります。各ゲームには 6 人までしか参加できません。

複数のサーバーが BRPOP を使用して LIST からユーザーを取得しています (users:waiting)。

サーバーがユーザー 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 に答える