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 に切り替える。
同じデータベースの他の項目
- NOGROUP No such key or consumer groupNo such key or consumer group in stream(ストリームにそのキーまたはコンシューマグループがない)
- NOTBUSY No scripts in execution right nowNo scripts in execution right now(現在実行中のスクリプトはない)
- DENIED Redis is running in protected modeRedis is running in protected mode(Redis は保護モードで稼働中)
- ERR SELECT is not allowed in cluster modeSELECT is not allowed in cluster mode(クラスタモードでは SELECT は許可されない)
- ERR wrong number of arguments for commandWrong number of arguments for command(コマンドの引数の数が誤っている)
- ERR Background save already in progressBackground save already in progress(バックグラウンド保存が既に進行中)
- ERR bit offset is not an integer or out of rangeBit offset is not an integer or out of range(ビットオフセットが整数でないか範囲外)