Redis punsubscribe 不是取消订阅

Redis punsubscribe not unsubscribing

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

但我遇到的问题是我想一次性取消订阅该频道。我通过阅读 redis-documentation 的假设是我会使用 punsubscribe 这样我就可以使用 lobby:*: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 lobby:*:joined 时有效。我也可以通过将大厅 ID 传递给取消订阅处理程序来解决这个问题,但是 punsubscribe 应该 是它的解决方案。

我之前也遇到过这种情况,我遍历了一个用户 ID 数组,并在 statuses:${userID} 上为每个用户创建了一个订阅,并在 statuses:* 上尝试了一个 punsubscribe,但没有任何成功。

我是不是做错了什么,或者这是一个与 node-redis 相关的问题?我正在使用 redis 版本 2.8.0

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