node-redis
具有出色的功能,可以处理任何Redis断开连接。如果Redis实例变得不可用,则使用适当的retry_strategy
表示客户端可以设置为尝试重新连接,直到Redis再次可用。
是否有可能让客户端在启动时进入此状态,即使Redis已关闭?
我的情况是:我使用Redis作为主数据存储,使用基于Redis的后备辅助数据存储。当我的应用程序启动时,如果Redis不可用,则尝试检索数据将改为使用辅助数据存储。
但是,当Redis确实可用时,我希望我的应用程序开始使用Redis主数据存储。由于Redis连接在启动时没有成功,retry_strategy
(对于先前建立的连接将处理此问题)不起作用。
我可以编写代码来重试最初的Redis连接,直到它成功为止,但是我觉得开箱即用的功能已经非常接近我需要的功能,如果我能说服它来的话即使Redis失败,从初创公司开始发挥作用。
答案 0 :(得分:3)
retry_strategy实际上可以返回一个以毫秒为单位的数字,以尝试在此之后重试连接。如果在节点启动时关闭连接,则只需返回例如当错误代码为NR_CLOSED或ECONNREFUSED以使其在5秒后重试时为5000.
示例:
const retry_strategy = function(options) {
if (options.error && (options.error.code === 'ECONNREFUSED' || options.error.code === 'NR_CLOSED')) {
// Try reconnecting after 5 seconds
console.error('The server refused the connection. Retrying connection...');
return 5000;
}
if (options.total_retry_time > 1000 * 60 * 60) {
// End reconnecting after a specific timeout and flush all commands with an individual error
return new Error('Retry time exhausted');
}
if (options.attempt > 50) {
// End reconnecting with built in error
return undefined;
}
// reconnect after
return Math.min(options.attempt * 100, 3000);
}
使用此重试策略创建客户端:
const client = redis.createClient({retry_strategy: retry_strategy});
答案 1 :(得分:2)
默认情况下,客户端会尝试重新连接,直到连接为止。如果要自定义,可以使用选项object properties中提供的retry_strategy。你可以知道redis连接的时间,因为它会发出一个事件
client.on("connect", function (){
});
以后您可以决定如何处理连接