CLIENT UNBLOCK client-id [TIMEOUT|ERROR]

このコマンドは、例えばBRPOP または XREAD または WAIT のようなブロック操作でブロックされたクライアントを、別の接続からブロック解除することができます。

デフォルトでは、クライアントはコマンドがタイムアウトに達したかのようにブロック解除されますが、追加(オプション)の引数が渡された場合、TIMEOUT (デフォルト) あるいは ERROR のようなブロック解除の挙動を指定することができます。ERROR が指定された場合、クライアントが強制的にブロック解除されたという事実をエラーとして返します。具体的にはクライアントは以下のエラーを受け取ります:

-UNBLOCKED client unblocked via CLIENT UNBLOCK

注意: もちろんいつも通りエラーテキストが同じであることは保証されませんが、エラーコードは-UNBLOCKEDのままです。

このコマンドは限られた接続数で多くのキーを監視する場合に特に役立ちます。例えば、N個を超えない接続を使ってXREADで複数のストリームを監視したいかもしれません。ある時点で監視するストリーム キーがもう1つあることがコンシューマプロセスに通知されます。より多くの接続を避けるためには、プール内の接続の1つからブロック コマンドを停止し、新しいキーを追加して、ブロックコマンドを再度発行するのが最良の挙動です。

この挙動を取得するために次のパターンが使用されます。必要に応じて CLIENT UNBLOCK コマンドを送信するために、追加の 制御接続を使います。それまでの間、他の接続でブロック操作を実行する前に、プロセスはその接続に関連するIDを取得するために CLIENT ID を実行します。新しいキーが追加されなければならない場合、あるいはキーがもう監視する必要が無くなった場合は、コマンドをブロックしている関連する接続は制御接続の中でCLIENT UNBLOCK を送信することで中止されます。ブロックコマンドが返され、最終的に再発行することができます。

この例は、Redisストリームのコンテキストでアプリケーションを表していますが、パターンは一般的なものであり、他のケースに適用できます。

Connection A (blocking connection):
> CLIENT ID
2934
> BRPOP key1 key2 key3 0
(client is blocked)

... Now we want to add a new key ...

Connection B (control connection):
> CLIENT UNBLOCK 2934
1

Connection A (blocking connection):
... BRPOP reply with timeout ...
NULL
> BRPOP key1 key2 key3 key4 0
(client is blocked again)

*返り値

Integer reply、 具体的には:

  • クライアントのブロックが正常に解除された場合 1
  • クライアントのブロックが解除されていない場合 0
TOP
inserted by FC2 system