如何设置node-redis重连尝试次数?及ready事件异常疑问
问题与解决方案:node-redis重连限制及ready事件异常
一、限制重连尝试次数
node-redis默认会无限次尝试重连,要实现1-3次的重连限制,不能直接给reconnectStrategy设固定间隔,需将其改为自定义函数,在函数内跟踪重连次数,超过阈值时抛出错误终止重连流程:
- 初始化重连计数器,每次重连时递增计数
- 当计数器超过设定的最大次数(比如3次),抛出错误,客户端会停止重连并触发
end事件 - 未超过次数时,返回下一次重连的间隔时间
二、ready事件异常触发说明
ready事件的触发逻辑是客户端与Redis服务器完成握手、确认连接可用时才会触发。你遇到的"未建立连接时触发",大概率是重连过程中短暂建立连接但随即断开(比如Redis容器重启后未完全就绪),或是客户端状态更新存在延迟。可以通过维护连接状态标志,结合ready和error事件准确判断连接状态,避免误判。
修改后的完整代码
static #reconnectAttempts = 0; static #isConnected = false; static async init() { if (!process.env.REDIS_HOST || !process.env.REDIS_PORT || !process.env.REDIS_TTL) { Logger.error('Redis configuration missing - running without cache'); return; } try { this.#client = await createClient({ socket: { host: process.env.REDIS_HOST, port: Number(process.env.REDIS_PORT), connectTimeout: 1000, // 自定义重连策略函数 reconnectStrategy: (retries) => { this.#reconnectAttempts = retries; const maxAttempts = 3; if (retries > maxAttempts) { Logger.error(`Max Redis reconnection attempts (${maxAttempts}) exceeded`); // 抛出错误终止重连 throw new Error("Max reconnection attempts exceeded"); } Logger.info(`Redis reconnect attempt ${retries}/${maxAttempts}, next attempt in 5s`); // 返回重连间隔时间 return 5000; } }, disableOfflineQueue: false, }); this.#attachHandlers(); await this.#client.connect(); } catch (err) { Logger.warn(`Redis init failed: ${err}. Cache disabled`); } } static #attachHandlers() { this.#client.on("error", (err) => { this.#isConnected = false; Logger.warn(`Redis error: ${err.message}`); }); this.#client.on("end", () => { this.#isConnected = false; Logger.info(`Redis connection has been closed`); }); this.#client.on("connection", () => Logger.info(`Initiating a connection to the Redis`)); this.#client.on("reconnecting", () => Logger.info(`Reconnecting to the Redis`)); this.#client.on("ready", () => { this.#isConnected = true; this.#reconnectAttempts = 0; // 重连成功后重置计数器 Logger.info(`Redis connection established`); }); }
关键修改点说明
- 新增
#reconnectAttempts计数器,跟踪重连次数 - 将
reconnectStrategy改为函数,实现次数限制逻辑 - 新增
#isConnected状态标志,准确记录当前连接状态 - 重连成功后重置计数器,避免后续重连时计数错误
内容的提问来源于stack exchange,提问作者Stas
相关产品推荐
相关产品推荐

