如何检查Redis通道是否已通过StackExchange.Redis订阅?

时间:2020-01-02 18:43:31

标签: c# .net redis publish-subscribe stackexchange.redis

我有一个运行某些进程的Windows服务,必须在浏览器上通知它的进度。我不确定自己是否做得很好,但是我只是做了:

Windows Service publish a json on a redis channel called 'web'-> An action on ASP.NET MVC application subscribe the 'web' channel and send the json to browser via signalR hub-> the browser take it and show the progress

我有以下代码(它是一个帮助程序),用于在发布后添加频道范围。从我的控制器/操作中调用它:

public void Listen(string channel, Action<string, object> action)
{
   var sub = Client.GetSubscriber();

   sub.Subscribe(channel, (c, v) =>
   {
      action(c.ToString(), v.ToString());
   });
}

问题:它可以正常运行,并且通知浏览器。问题是用户(在浏览器上)按下F5或再次执行操作时。它创建了一个新频道,我收到了重复的消息。如果用户再次执行它,我开始每条消息收到3条消息,依此类推。我想避免它。

我尝试过的操作:我尝试使用IsConnection(channel),但它始终返回true。我已经尝试在Unsubscribe(channel)之前再次Subscribe(channel),并且它可以工作,但是我不确定是否会丢失一些消息(恐怕)。我不知道如何解决它,避免重复订阅。有人可以帮助我吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

您是否正在使用ConnectionMultiplexer?参见Using redis pub/sub

...如果连接失败,ConnectionMultiplexer将 处理重新订阅所请求频道的所有详细信息

考虑从发布/订阅切换到Redis流。参见What are the main differences between Redis Pub/Sub and Redis Stream?

您可以使用groups and clients来命名Consumer Groups。因此,您可以通过会话或其他任何方式对其进行控制,甚至可以使用fingerprint.js之类的方式来匿名标识每个浏览器。

相关问题