1

Redis セット間で要素を移動する一連のスクリプトがあります。これらの操作は、アトミックである必要がある場合があります。1 つのスクリプトが失敗することがありますが、他のスクリプトは引き続き機能します。

あるスクリプトで MULTI を実行して開始するとどうなるか興味がありますが、スクリプトが何らかの形で失敗し、EXEC または DISCARD を呼び出すことはありません。トランザクションが発生しないため、データの整合性が良好であることはわかっていますが、コマンドどこかでキューに入れられ、決して実行されない これがあまりにも頻繁に発生する場合 (そうあるべきではありませんが、誰にもわかりません)、キューをクリーンアップする必要があるのではないかと心配しています。

4

1 に答える 1

5

「スクリプトが失敗しました」の正確な意味に依存します

redis サーバーへの接続が失われた場合、クエリ バッファーは解放されます。

redis サーバーへの接続がまだアクティブで、コードの他のセクションがそれをまったく使用しない場合、クエリ バッファーはサーバー上のメモリを占有し続けます。デフォルトでは、アイドル状態のクライアント接続は終了されません。timeoutredis.conf でa を指定した場合、クエリ バッファは最終的に再利用されます。

redis サーバーへの接続がまだアクティブで、スクリプト内の別のモジュール/関数/ブロックが接続を再利用している場合、事態はさらに興味深いものになります。それらが実行するコマンドは、前のマルチブロックの一部であるため、サーバーでキューに入れられます。このモジュールが別のマルチを開始すると、redis サーバーは「(エラー) ERR MULTI 呼び出しをネストできません」と応答しますが、クエリ バッファーはクリアされません。アプリケーションがどのように動作するかは、使用している redis ドライバーに大きく依存します。

于 2012-08-22T04:29:31.927 に答える