検索

ホームページ  >  に質問  >  本文

Predis はトランザクションを使用して 2 つのコマンドを実行しますが、そのうちの 1 つが失敗します

説明エラー

Redis リストを使用してリミッターを作成しており、ほとんどの場合期待どおりに機能しますが、最近、有効期限のないキーがいくつかあることに気付きました。理想的には、リストに値を「rpush」し、トランザクションの有効期限を設定し、トランザクションが開始する前に「watch」も使用します。

###再現###

jmeter を使用して、1 秒間に 500 件のリクエストなど、関連する API をバッチリクエストしても、このバグはローカル環境では再現されません

###バージョン:###

予測: v2.1.2 PHP7.4 Redisサーバー5.0.10

コード例

リーリー ###他の###

これはローカル Redis サーバーで予期される操作です

Redis トランザクションはアトミックです。アトミックとは、すべてのコマンドが処理されるか、コマンドがまったく処理されないことを意味します。したがって、私の場合、キーには有効期限が必要です。

P粉030479054P粉030479054495日前707

全員に返信(1)返信します

  • P粉113938880

    P粉1139388802023-09-14 11:49:51

    Redis トランザクションは、そのようなアトミックなトランザクションではありません。コマンド内のトランザクションの実行中は他のプロセスがキー空間にアクセスできないため、これらはアトミックです。トランザクション内のコマンドが失敗した場合、後続のコマンドは実行され、ロールバックされません。

    たとえば、間違ったコマンドを含むトランザクションを実行してみましょう:

    リーリー

    ここでは、リストが存在するかどうかを確認し、いくつかの初期項目をリストに追加します。次に、トランザクション内でリストから項目をポップし、誤って新しい項目を追加しようとして、キー mylist がコレクションを所有していると考え、キー mylist< 上的生存时间/代码> を設定します。最初と 3 番目のコマンドは成功し、最後に mylist が存続時間を設定します。 2 番目のコマンドは失敗します。このためのロールバック機能は Redis に組み込まれていません。アプリケーションは watch コマンドを介してオプティミスティック ロックを使用する必要があります。これは、トランザクションが必要な変更をトランザクションが取得する前に、他のプロセスによる変更を検出するためです。キーはサーバーに排他的にアクセスできます。これはロールバックメカニズムではありません。

    詳細: https://redis.io/docs/interact/transactions/

    返事
    0
  • キャンセル返事