Redis UNSUBSCRIBE命令无法删除已订阅的频道

3

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)

请查看[ask]和[mcve],并编辑您的问题。 - Paxz
1
你为什么认为这个通道仍然存在? - Marc Gravell
3个回答

0

您无法手动删除频道。

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


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);`
- Arsen Avagyan
这是我的一部分代码,而在这种情况下通道并未被移除。 - Arsen Avagyan
有源代码吗? - Muhammad Umer
@MuhammadUmer 源代码,即pubsub.c,解释了一切 :) - for_stack

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问题。


0

你可以试着这样做, 使用 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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接