我有一个用于pub-sub的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数组,并为每个用户id创建了一个订阅 statuses:${userID}
尝试了一个 punsubscribe
在 statuses:*
,没有任何成功。
是我做错了什么,还是这是一个与redis相关的问题?我用的是redis版本 2.8.0
1条答案
按热度按时间jdg4fx2g1#
我注意到有两种不同类型的订阅。关于渠道和模式。在我的问题中,我订阅了一个频道,并取消订阅了一个模式,这两个是不'兼容',所以这将不起作用。我曾经
nc
调试这个,就像redis-cli
进入订阅状态时不允许附加命令。