多次订阅同一个Redis频道时如何避免重复通知?

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

我遇到一个问题,如果我多次订阅同一个 Redis 频道,我的订阅者就会开始收到重复的消息。

这是我的订阅方法:

public void SubscribeToUserNotifications(string userId, Action<string?> onMessage)
{
    _subscriber.Subscribe
        (
        new RedisChannel($"orders:notifications:user:{userId}",
            RedisChannel.PatternMode.Literal), (channel, message) =>
            {
                onMessage(message);
            });
}

我还有一个方法,可以在为用户添加新订单时发布消息:

public async Task AddOrderForUserAsync(string userId, OrderInfo order)
{
    var db = _redis.GetDatabase();

    string orderKey = $"orders:user:{userId}";

    string orderData = JsonConvert.SerializeObject(order);

    await db.HashSetAsync(orderKey, order.Id.ToString(), orderData);

    _subscriber.Publish(
        new RedisChannel($"orders:notifications:user:{userId}", RedisChannel.PatternMode.Literal),
        orderData
    );
}

我检查了我的代码,意识到每次用户订阅时,都会创建对同一频道的新订阅,这会导致同一条消息被多次发送给同一个订阅者。 我试图检查订阅是否已经存在,但Redis本身似乎并没有提供直接的方法来避免重复订阅。

我希望订阅者每条已发布的消息仅收到一个通知,即使他们多次订阅同一频道也是如此。

问题: 多次订阅同一个 Redis 频道时,如何避免或防止重复通知? Redis 中是否有内置方法来管理此问题,或者我应该在应用程序端处理它?

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

没有内置方式。您可以在订阅之前使用标志。

bool hasExecuted = false;
public void SubscribeToUserNotifications(string userId, Action<string?> onMessage)
{
    if (!hasExecuted)
    {
        _subscriber.Subscribe(...);
        hasExecuted = true;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.