DBAtlas · データベース運用アトラス

ERR Can't execute '<cmd>': only (P|S)SUBSCRIBE / (P|S)UNSUBSCRIBE / PING / QUIT / RESET are allowed in this context: Command not allowed in subscribe context(subscribe コンテキストでは許可されないコマンド)

Redis

意味

接続が Pub/Sub の subscribe モードに入った後、このモードでは許可されない通常のコマンド (例: GET/SET) を実行しようとした。subscribe モードの接続は限られたコマンドのみを受け付ける。古いバージョンでのメッセージは "ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context" であった。

原因

SUBSCRIBE/PSUBSCRIBE/SSUBSCRIBE で subscribe モードに切り替わった接続でデータコマンドを送信した。RESP2 プロトコルでは、購読中の接続で許可されるのは (P|S)SUBSCRIBE、(P|S)UNSUBSCRIBE、PING、QUIT、RESET のみ。pub/sub と通常の処理で 1 つの接続を共有するのが典型的な誤り。

対処方法

Pub/Sub 用に専用の接続を使用し、通常のコマンド用に別の接続を開く (ほとんどのクライアントライブラリは自動的にこれを行う)。subscribe モードを抜けるには UNSUBSCRIBE/PUNSUBSCRIBE を送信する。その後は通常のコマンドが機能する。RESP3 プロトコル (HELLO 3) では購読中の接続でも他のコマンドが許可されるため、ドライバが対応していれば RESP3 に切り替える。

DBAtlas で開く →

同じデータベースの他の項目