Redis UNSUBSCRIBE不会删除频道

时间:2018-07-20 12:44:15

标签: redis

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)

3 个答案:

答案 0 :(得分:0)

您无法手动删除频道。

如果没有客户端订阅频道,Redis将自动删除该频道。

答案 1 :(得分:0)

sub.unsubscribe(roomChannelName); 
this.scServer.exchange.destroyChannel(roomChannelName)

我不清楚这是哪个库,但是:redis中的“销毁通道” 不是一个概念。只要存在一个或多个正在监听的通道(通过subscribepsubscribe),该通道就处于活动状态。它不会以任何其他语义意义“存在”-不需要提前声明,也不需要销毁它。如果要查看频道是否有监听器,可以使用以下任一方法:

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;