私は既にredisトランザクションについて複数の記事を読んでいます。 メッセージを含むリストがあります。そして私はredisを使って、これらのメッセージの自動増分IDを生成します。 ここに私がやろうとしていることがあります:固定数のクライアントによるRedisトランザクション
- カウンタ値を読み取ってからINCRしてください。
- インクリメントされたカウンタ値をメッセージの
Id
フィールドに置き、メッセージをシリアル化します。 - シリアル化されたメッセージをリストにプッシュします。
したがって、カウンタは常に対応するリストの最後のメッセージのIDを保持します。私はカウンターキーにロックをかけて、他の要求ではカウンターを読み取ったりINCRしたりして、最後のIDと競合する別のメッセージをリストにプッシュできないようにします。
私は限られた数のredisクライアントを持ちたいので、WATCH MULTI EXCECは実装できません。トランザクションを実行するのは同じクライアントだからです。そして、私が知っている限り、WATCH MULTI EXCECは、複数の赤いクライアントがある場合のためのものです。
私はこの問題の正しい解決方法を知りたいと思います。 LUAスクリプトを使用してメッセージをシリアル化する必要がありますか?
"リスク"というのは、リストの最後のメッセージがカウンタと同じIDを持っていない可能性があるということです。 –
本当に、リスト内のメッセージの順序は、アトミック性がなければ必ずしも正しいとは限りません。それが必要な場合は、Luaを使用してください。 –