【问题标题】:Redis punsubscribe not unsubscribingRedis punsubscribe 不取消订阅
【发布时间】:2020-04-28 00:04:31
【问题描述】:

我有一个用于发布订阅的 redis 客户端。我正在使用 websocket 消息处理程序来动态订阅 redis 频道。 websocket 消息的有效负载包含一个用于创建通道名称的 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 时,该模式在使用PUBSUB CHANNEL lobby:*:joined 时似乎有效。我也可以通过将大厅 ID 传递给取消订阅处理程序来解决此问题,但 punsubscribe 应该 是解决此问题的方法。

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

我做错了什么还是与 node-redis 相关的问题?我用的是redis版本2.8.0

【问题讨论】:

    标签: node.js redis node-redis


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 2022-01-19
      • 2017-12-18
      • 2012-03-14
      • 2016-07-27
      • 1970-01-01
      相关资源
      最近更新 更多