提问者:小点点

Redis不退订


我有一个用于pub-sub的redis客户端。我正在使用websocket消息处理程序动态订阅redis频道。websocket消息的有效负载包含我用来创建频道名称的ID。例如lobbyID:${lobbyID}:joined。订阅此频道效果良好,发布到该频道时会收到消息。

但我遇到的问题是,我想在某个时候取消这个频道的订阅。通过阅读redis文档,我的假设是,我会使用punsubscribe,这样我就可以使用lobble::::joined,从任何频道取消订阅,但尝试后仍会收到消息。

import redis from 'redis';

const subClient = redis.createClient();

subClient.on('message', (channel, message) => {
  // Received message x on channel y
});

const socketHandlerSubscribe = (lobbyID) => {
  subClient.subscribe(`lobby:${lobbyID}:joined`);
}

const socketHandlerUnsubscribe = () => {
  subClient.punsubscribe('lobby:*:joined'); // true
}

当使用redis cli时,该模式在使用PUBSUB CHANNEL Lobble:::::joined时似乎有效。我也可以通过将大厅ID传递给unsubscribe处理程序来解决这个问题,但是punsubscribe应该是解决这个问题的方法。

我在前面的一个场景中也遇到了这种情况,我在状态:${userID}上循环了一系列用户ID,为每个用户创建了订阅,并在状态:上尝试了punsubscribe,但没有成功。

我做错了什么还是这是一个节点相关的问题?我正在使用redis版本2.8.0


共1个答案

匿名用户

我注意到有两种不同类型的订阅。关于渠道和模式。在我的问题中,我订阅了一个频道,取消订阅了一个模式,这两个模式不“兼容”,所以这不起作用。我使用了nc来调试它,因为redis cli在进入订阅状态时不允许使用其他命令。