我正在将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 的响应时间范围。
请提供一些意见。
正如您可以从此 ioredis 问题中读到的那样,没有每个命令超时配置。
如链接注释中所建议的,您可以使用基于 Promise 的策略作为解决方法。顺便说一下,这与 ioredis-timeout 插件使用的策略相同,该插件将原始命令包装在 Promise.race()
方法中:
//code from the ioredis-timeout lib
return Promise.race([
promiseDelay(ms, command, args),
originCommand.apply(redis, args)
]);
因此,您可以使用插件或这种不错的race
超时技术在 redis 客户端之上添加超时功能。请记住,基础命令不会中断。
我遇到了类似的问题,我在这里详细描述了这个问题:如何配置 Node Redis 客户端在连接失败时立即抛出错误?[阅读详情]
修复实际上非常简单,只是将enable_offline_queue
设置为 false。这是Node Redis的,所以你必须找出IORedis的等价物。将其设置为 false,将使所有命令立即引发异常,您可以在 catch 块中处理该异常并继续而不是等待一些超时。
请记住,如果enable_offline_queue
设置为 false,则在服务器出现某些连接问题时发出的命令将永远不会执行。