【发布时间】: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