Redis punpunsubscribe不退订

时间:2020-04-13 15:40:31

标签: node.js redis node-redis

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

但是我遇到的问题是我想在某一时刻退订该频道。通过阅读redis文档,我的假设是我将使用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时,该模式似乎有效。我也可以通过将大厅ID传递给取消订阅处理程序来解决此问题,但是PUBSUB CHANNEL lobby:*:joined 应该是它的解决方案。

我在较早的场景中也遇到过这种情况:我遍历了一组用户ID,并在punsubscribe上为每个ID创建了一个订阅,并在statuses:${userID}上尝试了punsubscribe,但没有成功

我做错什么了吗,或者这是与节点redis有关的问题?我正在使用Redis版本statuses:*

1 个答案:

答案 0 :(得分:0)

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