Redis punsubscribe不退订。

问题描述 投票:0回答:1

我有一个用于pub-sub的redis客户端。我使用 websocket 消息处理程序来动态订阅 redis 通道。websocket消息的有效载荷包含一个ID,我用它来创建channel-name。因此,例如 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} 并尝试了 punsubscribe 关于 statuses:*没有任何成功。

是我做错了什么,还是这个问题与node-redis有关?我使用的是redis版本 2.8.0

node.js redis node-redis
1个回答
0
投票

我注意到有两种不同类型的订阅。关于通道和模式。在我的问题中,我订阅了一个通道,并在一个模式上取消订阅,这两者并不 "兼容",所以这将无法工作。nc 来调试,如 redis-cli 当进入订阅状态时,将不允许附加命令。

© www.soinside.com 2019 - 2024. All rights reserved.