Redis连接从密切的事件去了

在我们的redisconfiguration中,我们设置了超时时间:7秒

在node_redis中,我们处理redis连接就绪和结束事件

client.on("ready", function() { logger.info("Connection Successfully Established to ", this.host, this.port); } client.on("end", function() { logger.fatal("Connection Terminated to ", this.host, this.port); } 

示例日志

[2012-07-11 08:21:29.545] [致命]生产 – 连接终止于'xxx9''6399'
[2012-07-11 08:21:29.803] [信息]生产 – 连接成功build立到'xxx9''6399'

但在某些情况下(很可能是redis在不通知客户端的情况下closures连接),我们看到命令队列堆积并且请求花费太多时间来获取响应[直到node-redis客户端能够感知closures事件]。 在所有这些情况下,返回命令callback,这个错误Redis connection gone from close event 。 即使经过如此多的等待。 看起来好像这不是一个问题,因为通常的结束事件没有被触发。

问题似乎与此相似 – http://code.google.com/p/redis/issues/detail?id=368

这是一个已知的事情发生在redis?

有没有一种方法可以指定执行命令[发送和接收应答]的执行不应超过阈值,并在这种情况下应答错误,而不是使客户端失速?

或者是有没有其他的方法来触发closures事件在这种情况下,如socket_timeout?

或者我们应该从我们的redis方面检查一些东西? 我们在debug级别监视了我们的redis日志,我们发现这个问题没有什么用处

当我们在debugging模式下运行node-redis时,我们显然能够看到客户端在请求堆积在命令队列中时停滞了。 我们logging了flush_on_error函数内的原因和队列长度 。 我们保持offline_queuing禁用。

示例日志

Redis连接从密切事件中消失。 脱机队列0命令队列8

请求失败的响应时间:30388毫秒[这取决于在命令队列中的等待情况。 第一个排队的人有最大的回应时间,跟随他的人更less]

常用谐振时间:1 ms

PS:我们也在node_redis中提出了一个问题

我们还有一些与Redis的连接问题。 似乎它会在没有告诉客户的情况下closures连接。 我们注意到这可能是服务器上的超时问题。 这是我们使用的解决scheme,自从七月份以来我们一直没有问题。

 var RETRY_EVERY = 1000 * 60 * 3; var startTimer = function(){ console.log('Begin the hot tub!') setInterval(function(){ try{ client.set('hot',new Date()); console.log(client.get('hot')) } catch(e){ console.log(e); } },RETRY_EVERY) }(); 

考虑到每3分钟只有一个呼叫,这不应该是一个性能问题;)

关于oconnecp的答案,你不能只是做:

 setInterval(client.ping(), 1000 * 60 * 30);