我遇到一个问题,如果我多次订阅同一个 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 中是否有内置方法来管理此问题,或者我应该在应用程序端处理它?
没有内置方式。您可以在订阅之前使用标志。
bool hasExecuted = false;
public void SubscribeToUserNotifications(string userId, Action<string?> onMessage)
{
if (!hasExecuted)
{
_subscriber.Subscribe(...);
hasExecuted = true;
}
}