sub.unsubscribe
不删除频道,我该如何删除频道?
我尝试了channel.close()
或channel.quit()
,但是没有用!
代码:
let roomChannelName = room_${roomId}_server;
let sub = redis.createClient(redisConfig);
const channel = this.scServer.exchange.channel(roomChannelName);
sub.unsubscribe(roomChannelName);
this.scServer.exchange.destroyChannel(roomChannelName)
答案 0 :(得分:0)
您无法手动删除频道。
如果没有客户端订阅频道,Redis将自动删除该频道。
答案 1 :(得分:0)
sub.unsubscribe(roomChannelName);
this.scServer.exchange.destroyChannel(roomChannelName)
我不清楚这是哪个库,但是:redis中的“销毁通道” 不是一个概念。只要存在一个或多个正在监听的通道(通过subscribe
或psubscribe
),该通道就处于活动状态。它不会以任何其他语义意义“存在”-不需要提前声明,也不需要销毁它。如果要查看频道是否有监听器,可以使用以下任一方法:
pubsub numsub {channel name}
或者,如果您不介意发送虚拟数据,只需将其发布即可:
publish {channel name} {dummy value}
这两个都将返回该频道的订阅者数量:
127.0.0.1:6379> pubsub numsub foo
1) "foo"
2) (integer) 0
127.0.0.1:6379> publish foo bar
(integer) 0
我不知道您的图书馆是否有API公开此信息,但最终:您无需在此处做任何事情。您无需使用pub / sub进行清理。
如果您的sub.unsubscribe(roomChannelName);
呼叫未能发出unsubscribe
/ punsubscribe
,那么这是一个库问题,而不是redis问题。
答案 2 :(得分:0)
您可以尝试类似的东西, 仅在pmesseege输入数据时使用psubscribe并处理 符合您的需求。
const RedisInstance = require("./redis");
const Subscriber = new RedisInstance().client;
const socketsDataList = require('./activeSocketsList');
const orderManager = require("./orderManager");
class RedisSubscriber {
subscriber = Subscriber;
constructor() {
this.subscriber.psubscribe(`order_*`);
this.subscriber.on("pmessage", (pattern , channel , order) => this.onOrder(
channel , order) );
}
async getSocketByDeviceId(deviceId) {
return await socketsDataList.checkIfSocketExistsForThisDevice(deviceId);
}
async onOrder(channel , order ) {
const deviceId = channel.split("_")[1];
try {
const socketObj = await this.getSocketByDeviceId(deviceId);
if (socketObj['error']) {
console.log(socketObj['error']);
} else {
const socket = socketObj['activeSocket'].socket
await orderManager.sendOrderToClient( socket , order);
console.log({message: 'success'})
}
} catch (error) {
console.log(error)
}
}
}
module.exports = RedisSubscriber;