任何redis调用的ioredis send命令的默认超时是多少?

时间:2019-03-28 04:22:50

标签: node.js timeout redis-cluster ioredis

我正在将ioredis与节点应用程序一起使用,由于群集中的某些问题,我开始得到:

  

集群重定向过多。上一个错误:错误:连接已关闭。

由于我所有的redis调用均失败,并且经过了很长时间(从1秒到130秒),因此

ioredis库是否有默认超时,用于在将命令发送到Redis服务器后执行断言调用?

向Redis服务器发送命令时,故障时间较长,为100秒,是因为集群故障导致redis的队列大吗?

示例代码:

this.getData = function(bucketName, userKey) {
  let cacheKey = cacheHelper.formCacheKey(userKey, bucketName);
  let serviceType = cacheHelper.getServiceType(bucketName, cacheConfig.service_config);
  let log_info = _.get(cacheConfig.service_config, 'logging_options.cache_info_level', true);
  let startTime = moment();
  let dataLength = null;
  return Promise.try(function(){
    validations([cacheKey], ['cache_key'], bucketName, serviceType, that.currentService);
    return cacheStore.get(serviceType, cacheKey);
  })
  .then(function(data) {
    dataLength = (data || '').length;
    return cacheHelper.uncompress(data);
  })
  .then(function(uncompressedData) {
    let endTime = moment();
    let responseTime = endTime.diff(startTime, 'miliseconds');
    if(!uncompressedData) {
      if(log_info) logger.consoleLog(bucketName, 'getData', 'miss', cacheKey, that.currentService,
        responseTime, dataLength);
    } else {
      if(log_info) logger.consoleLog(bucketName, 'getData', 'success', cacheKey, that.currentService,
        responseTime, dataLength);
    }
    return uncompressedData;
  })
  .catch(function(err) {
    let endTime = moment();
    let responseTime = endTime.diff(startTime, 'miliseconds');
    logger.error(bucketName, 'getData', err.message, userKey, that.currentService, responseTime);
    throw cacheResponse.error(err);
  });
};

这里 logger.error(bucketName, 'getData', err.message, userKey, that.currentService, responseTime);

开始给出1061ms至109939ms的响应时间。

请提供一些输入。

2 个答案:

答案 0 :(得分:0)

您可以从此ioredis issue中了解到,没有每个命令的超时配置。

如链接的注释中所建议,您可以使用基于Promise的策略作为解决方法。顺便说一下,这与ioredis-timeout plugin使用的策略相同,该策略将原始命令包装在Promise.race()方法中:

//code from the ioredis-timeout lib
return Promise.race([
      promiseDelay(ms, command, args),
      originCommand.apply(redis, args)
]);

因此,您可以使用插件或this nice race timeout technique在redis客户端之上添加超时功能。请记住,基本命令不会被中断。

答案 1 :(得分:0)

我遇到了类似的问题,我在此处详细描述了该问题:How to configure Node Redis client to throw errors immediately, when connection has failed? [READ DETAILS]

修复实际上非常简单,只需将 enable_offline_queue 设置为 false。这是与 Node Redis 一起使用的,因此您必须找出 IORedis 的等效项。将此设置为 false,将使所有命令立即抛出异常,您可以在 catch 块中处理该异常并继续而不是等待一些超时。

请记住,当 enable_offline_queue 设置为 false 时,您在服务器出现连接问题时发出的命令将永远不会执行。