2016-08-04 7 views
0

を防ぐために、私はイベントのためのユーザー登録、Redisの:どのようにこの競合状態

  1. のRedisからこの文字列化配列を取得するたびに、フィールドには、文字列化された配列として値を持つ1にRedisの中にハッシュを持っています2人のユーザーがCLOで登録した場合の潜在的な競合状態の可能性がここにある配列を文字列化して

をハッシュするために戻って保存するバックエンドでパースし、配列

  • にユーザーのユーザー名を追加十分な時間。

    レースの条件は、両方のユーザーがredisから同じ文字列配列を取得して変更することで、他のユーザーによって上書きされるため、1つの更新のみが発生します。

    SQLのトランザクションのようにこの競合状態を回避する方法はありますか。私はmultiについて読んだことがありますが、サーバ上のコマンド間で計算を行うことはできません。

    また、ストリング化配列を格納してハッシュフィールドとして格納することは悪い考えです。私はこのredisに対して通常のリストを使用する必要があります。

  • +0

    バックエンドの言語は何ですか? – vaultah

    +0

    ノードjs/express –

    答えて

    3

    解決策はできる限り原子操作を使用することです。あなたは、いくつかのオプションがあります。そのようLPUSH

  • 変更を追跡するLua script(彼らは定義による原子です)
  • 使用Redis transactionsWATCHコマンド内ですべてを行うなどの便利なコマンドをサポートし

    • 使用本当のRedisのリストを

    通常、WATCHの使用には、成功するまでトランザクションの実行が試行されます。単純なループでこれを行うことができますが、コネクターには特別な便利な方法があります。

  • +0

    通常のリストを使用している場合、競合状態に関する問題はありません。しかし、問題のシナリオについては、それは解決可能ですか? –

    +1

    @AmanGupta:はい、少なくとも2つのオプションがありますが、すべて私の答えに記載されています。 – vaultah

    +1

    これまでルアスクリプトの能力を知らなかった。このためにルアに行く。 –