2017-01-09 7 views
1

私は既にredisトランザクションについて複数の記事を読んでいます。 メッセージを含むリストがあります。そして私はredisを使って、これらのメッセージの自動増分IDを生成します。 ここに私がやろうとしていることがあります:固定数のクライアントによるRedisトランザクション

  1. カウンタ値を読み取ってからINCRしてください。
  2. インクリメントされたカウンタ値をメッセージのIdフィールドに置き、メッセージをシリアル化します。
  3. シリアル化されたメッセージをリストにプッシュします。

したがって、カウンタは常に対応するリストの最後のメッセージのIDを保持します。私はカウンターキーにロックをかけて、他の要求ではカウンターを読み取ったりINCRしたりして、最後のIDと競合する別のメッセージをリストにプッシュできないようにします。

私は限られた数のredisクライアントを持ちたいので、WATCH MULTI EXCECは実装できません。トランザクションを実行するのは同じクライアントだからです。そして、私が知っている限り、WATCH MULTI EXCECは、複数の赤いク​​ライアントがある場合のためのものです。

私はこの問題の正しい解決方法を知りたいと思います。 LUAスクリプトを使用してメッセージをシリアル化する必要がありますか?

答えて

2

Luaは、データを読み書きするアトミックロジックユニットを作成するための最良のオプションです。

あなたの場合、私は原子性が本当に必要であると確信していません。 IDに間にギャップがないという厳しい要件がない限り、INCRBYに電話して新しいIDを取得し、それをメッセージのシリアル化に使用することができます。他のメッセージはではないは同じIDを取得し、そのIDを使用してメッセージをシリアライズして保存する(したがってギャップを作成する)前に作業者が死ぬ危険性があります。

+0

"リスク"というのは、リストの最後のメッセージがカウンタと同じIDを持っていない可能性があるということです。 –

+0

本当に、リスト内のメッセージの順序は、アトミック性がなければ必ずしも正しいとは限りません。それが必要な場合は、Luaを使用してください。 –

関連する問題