使用相同的redis.createClient()实例进行发布和订阅

时间:2012-08-19 19:59:01

标签: node.js redis socket.io

当我正在使用io.sockets.on('connection', function(socket){...});创建subscribe变量时,我正在使用redis在socket.io客户端之间发布和订阅消息。然后使用subscribe函数将客户端订阅到频道。

我的问题是它是否有权使用相同的订阅变量来执行发布操作?或者用redis.createClient()创建另一个用于发布消息的实例很重要,所以我将有2个实例,一个用于发布,一个用于订阅......

由于

2 个答案:

答案 0 :(得分:11)

来自Redis docs

  

一旦客户端进入订阅状态,除了额外的SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE和PUNSUBSCRIBE命令外,它不应该发出任何其他命令。

出于这个原因,您需要两个客户端,一个用于订阅,一个用于发布(以及可能的其他命令)。

答案 1 :(得分:0)

通过subscribe变量,你的意思是redis.createClient()返回的对象?如果是,请从文档When a client issues a SUBSCRIBE or PSUBSCRIBE, that connection is put into "pub/sub" mode. At that point, only commands that modify the subscription set are valid.开始,因此,您无法发布到首先订阅的客户端,这会发出Error: Connection in pub/sub mode, only pub/sub commands may be used错误。

您确实需要为订阅创建一个客户端(可以动态修改),以及一个要发布的客户端。当客户的订阅是免费的时,您将再次处于正常状态。