如何删除“消息”侦听器上的Redis
一个典型的Redis聊天示例将会像这样(参见https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js就是这样一个例子):
io.sockets.on('connection', function (client) { //websocket connection redis1.subscribe("chat"); redis1.on("message", function(channel, message) { console.log(message); client.send(message); }); client.on('message', function(msg) { redis2.publish("chat",msg.message); }); client.on('disconnect', function() { redis1.quit(); }); });
但是,这里的问题是,当client
断开连接时, redis1.on('message',FUNC(){})
侦听器仍然连接。 控制台将继续打印出message
。 如果要检查redis1的事件列表,他们仍然会发现匿名函数正在侦听。
问题是没有redis1.off(...)
函数。 那么,如何解绑/取消订阅/删除/删除redis消息侦听器呢?
注意:不能只是做redis1.end(),因为这将打破其他websocket连接用户的redis连接。
我通过在节点REPL中find的唯一解决scheme是不使用redis.on()
函数来订阅。 相反,应该使用redis.addListener()
和redis.removeListener()
函数。 另外,不能使用匿名函数作为事件callback。 人们可以这样做:
var callback = function(channel, message){ }; redis1.addListener('message', callback); client.on('disconnect', function(){ redis1.removeListener('message', callback); })