在 Redis ConnectionMultiplexer 上调用 UnsubscribeAll() 会影响其他 Redis 订阅

问题描述 投票:0回答:1

我有一个 Redis Connection Multiplexer 类,我将其注入到构造函数中的两个类中。

public class CLASS_1 {
    IConnectionMultiplexer _redis;
    public CLASS_1(IConnectionMultiplexer redis){
        _redis = redis
        subscribeToChannel()
    }

    public subscribeToChannel(){
         ISubscriber redisSubscriber = null;
         redisSubscriber = _redis.GetSubscriber();

         redisSubscriber.Subscribe("REDIS_CHANNEL",(channel, message) => {
             // alway listen to the messages and perform the task
         }
    }

    ~ CLASS_1(){
        redisSubscriber.Unsubscribe("REDIS_CHANNEL")
    }
}

public class CLASS_2 {
    IConnectionMultiplexer _redis;
    public CLASS_2(IConnectionMultiplexer redis){
        _redis = redis
    }

    public async executeCommand(){
         ISubscriber redisSubscriber = null;
         redisSubscriber = _redis.GetSubscriber();

         /// perform a task
         
         await redisSubscriber.SubscribeAsync("REDIS_CHANNEL", callBack);

         /// perform a task

         if (redisSubscriber != null) {                  
             redisSubscriber.UnsubscribeAll()
             // even if I do redisSubscriber.Unsubscribe("REDIS_CHANNEL") it still affects the other subscriptions                  
         }
    }

}

CLASS_1
是一个单例类,我正在订阅
CLASS_1
中的Redis频道。这意味着它只订阅该频道一次。该类始终监听通道消息并在收到任何消息时执行一些任务。唯一一次
CLASS_1
取消订阅频道是在析构函数中。

现在,

CLASS_2
不是一个单例类,并且应用程序中很少有它的实例。
CLASS_2
还订阅了
CLASS_1
中订阅的同一频道。但是
CLASS_2
也会在程序运行时的某个时刻取消订阅。

现在,当

CLASS_2
取消订阅时,就会出现问题,它也会取消
CLASS_1
中的活动订阅,而我不想取消
CLASS_1
中的订阅。

现在我想弄清楚是否使用 ConnectionMultiplexer 导致了问题?或者任何信息都会有帮助。

提前谢谢您! :)

c# redis publish-subscribe stackexchange.redis
1个回答
0
投票

使用

public void Unsubscribe(RedisChannel channel, Action<RedisChannel,RedisValue> msgHndlr)
{
    var sub = _connectionMultiplexer.GetSubscriber();
    sub.Unsubscribe(channel, msgHndlr, CommandFlags.FireAndForget);
}
© www.soinside.com 2019 - 2024. All rights reserved.