Redis发布/订阅版

Redis发布/订阅版,redis,publish-subscribe,Redis,Publish Subscribe,我目前正在使用Redis 2.6.12版和2.4.5版进行一些性能分析。我编写了一个发布/订阅应用程序,其中有一个窗口服务作为订户。和另一个windows窗体作为发布者 我注意到,在从发布者发送了大约50+条连续消息之后。订户停止响应新消息。发布服务器端没有引发异常 两个版本的Redis都出现了相同的行为 有没有人经历过这种奇怪的行为 这是我的windows窗体(publisher)中的代码: 这是我的订户的代码: using (_redisConsumer = new RedisClient(

我目前正在使用Redis 2.6.12版和2.4.5版进行一些性能分析。我编写了一个发布/订阅应用程序,其中有一个窗口服务作为订户。和另一个windows窗体作为发布者

我注意到,在从发布者发送了大约50+条连续消息之后。订户停止响应新消息。发布服务器端没有引发异常

两个版本的Redis都出现了相同的行为

有没有人经历过这种奇怪的行为

这是我的windows窗体(publisher)中的代码:

这是我的订户的代码:

using (_redisConsumer = new RedisClient("localhost"))            
    using (_subscription = _redisConsumer.CreateSubscription())
    {
        try
        {
             _subscription.OnSubscribe = channel => _logger.Info(string.Format("Subscribed to '{0}'", channel));
              _subscription.OnUnSubscribe = channel => _logger.Info(string.Format("UnSubscribed from '{0}'", channel));                    
              _subscription.OnMessage = (channel, msg) =>
              {
                  _logger.Info(string.Format("Received '{0}' from channel '{1}'", msg, channel));
                  var ltpm = JsonSerializer.DeserializeFromString<LastTrainProcessedMessage>(msg);

                  //persist to redis and trigger SignalR call...
                  _smState.UpdateLastTrainProcessedState(ltpm.ReadingTimestamp, ltpm.Location, SystemMonitorStatus.Normal);
                  _smState.AddAlerts(ltpm.NumberOfAlerts);                      
              };                    
              _logger.Info(string.Format("Started Listening On '{0}'", _channelName));
              _subscription.SubscribeToChannels(_channelName); //blocking
            }
            catch (Exception ex)
            {
                _logger.Error(ex);
            }
        }
使用(\u redisConsumer=new RedisClient(“localhost”))
使用(\u subscription=\u redisConsumer.CreateSubscription())
{
尝试
{
_subscription.onsubscripte=channel=>_logger.Info(string.Format(“订阅了{0}',channel));
_subscription.onunsubscripte=channel=>_logger.Info(string.Format(“从{0}'取消订阅,channel));
_subscription.OnMessage=(频道,消息)=>
{
_Info(string.Format(“从通道“{1}”接收的“{0}”,msg,channel));
var ltpm=JsonSerializer.DeserializeFromString(msg);
//持续到redis并触发信号器调用。。。
_smState.UpdateLastTrainProcessedState(ltpm.ReadingTimestamp、ltpm.Location、SystemMonitorStatus.Normal);
_smState.AddAlerts(ltpm.NumberOfAlerts);
};                    
_Info(string.Format(“开始侦听{0}'”,_channelName));
_subscription.SubscribeToChannels(_channelName);//阻塞
}
捕获(例外情况除外)
{
_记录器错误(ex);
}
}

谢谢。

您是否尝试使用:redis cli psubscribe“*”打开终端,以查看即使在订户挂起时,您的邮件是否仍会发送

问题显然来自
onMessage
侦听器内部,请删除以下行:

_subscription.UnSubscribeFromChannels(_channelName);
_subscription.SubscribeToChannels(_channelName);

它应该可以工作。

您好,我已经尝试运行该命令,但仍然可以看到从windows窗体发送的消息。我还添加了pubsub的代码。有机会的时候请看一看。谢谢你的时间。更新了我的答案。我想我发现了问题。我这么做了,但我还是遇到了同样的问题。谢谢你的建议。好吧,这可能是windows端口的问题,你在Redis的官方版本上试过同样的代码了吗?我说的是关于官方版本,我很确定你的代码会在那里工作(只需在虚拟机中运行,并与主机共享6379端口)
_subscription.UnSubscribeFromChannels(_channelName);
_subscription.SubscribeToChannels(_channelName);