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(在订阅上下文中不允许该命令)
Redis含义
连接进入 Pub/Sub 订阅模式后,您试图运行在此模式下不允许的普通命令(例如 GET/SET)。处于订阅模式的连接只接受有限的命令集。在旧版本中,消息为 "ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context"。
原因
在已通过 SUBSCRIBE/PSUBSCRIBE/SSUBSCRIBE 切换到订阅模式的连接上发送数据命令。在 RESP2 协议中,已订阅的连接只允许 (P|S)SUBSCRIBE、(P|S)UNSUBSCRIBE、PING、QUIT 和 RESET。用同一个连接同时处理 pub/sub 和普通工作是典型错误。
解决方法
为 Pub/Sub 使用专用连接,并为普通命令另开一个连接(大多数客户端库会自动这样做)。发送 UNSUBSCRIBE/PUNSUBSCRIBE 退出订阅模式;之后普通命令即可正常工作。在 RESP3 协议(HELLO 3)中,已订阅的连接上也允许其他命令;如果驱动支持,切换到 RESP3。
同一数据库的其他条目
- NOGROUP No such key or consumer groupNo such key or consumer group in stream(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(位偏移量不是整数或超出范围)