Redis リストを使用してリミッターを作成しており、ほとんどの場合期待どおりに機能しますが、最近、有効期限のないキーがいくつかあることに気付きました。理想的には、リストに値を「rpush」し、トランザクションの有効期限を設定し、トランザクションが開始する前に「watch」も使用します。
###再現###予測: v2.1.2 PHP7.4 Redisサーバー5.0.10
これはローカル Redis サーバーで予期される操作です
P粉1139388802023-09-14 11:49:51
Redis トランザクションは、そのようなアトミックなトランザクションではありません。コマンド内のトランザクションの実行中は他のプロセスがキー空間にアクセスできないため、これらはアトミックです。トランザクション内のコマンドが失敗した場合、後続のコマンドは実行され、ロールバックされません。
たとえば、間違ったコマンドを含むトランザクションを実行してみましょう:
リーリーここでは、リストが存在するかどうかを確認し、いくつかの初期項目をリストに追加します。次に、トランザクション内でリストから項目をポップし、誤って新しい項目を追加しようとして、キー mylist
がコレクションを所有していると考え、キー mylist< 上的生存时间/代码> を設定します。最初と 3 番目のコマンドは成功し、最後に
mylist
が存続時間を設定します。 2 番目のコマンドは失敗します。このためのロールバック機能は Redis に組み込まれていません。アプリケーションは watch
コマンドを介してオプティミスティック ロックを使用する必要があります。これは、トランザクションが必要な変更をトランザクションが取得する前に、他のプロセスによる変更を検出するためです。キーはサーバーに排他的にアクセスできます。これはロールバックメカニズムではありません。
詳細: https://redis.io/docs/interact/transactions/