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