Windows下Node.js项目实现Redis缓存及Redis宕机无法启动怎么解决?
启动报错信息:
PS D:\MyWorkSpace\PAS DEV BRANCH\cs_app_api> npm run dev > dev > ts-node ./src/server.ts App running on the port 8081 Error: connect ECONNREFUSED 127.0.0.1:6379 at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1148:16) { errno: -4078, code: 'ECONNREFUSED', syscall: 'connect', address: '127.0.0.1', port: 6379 } PS D:\MyWorkSpace\PAS DEV BRANCH\cs_app_api>
解决方案
问题根因为项目启动时会主动发起Redis连接,未捕获连接失败异常、也未配置不可用降级逻辑,连接报错直接触发进程崩溃退出。你可以按以下步骤修改代码解决问题:
1. 捕获Redis连接错误,避免异常导致进程退出
无论你使用的是ioredis还是node-redis客户端库,都要给Redis实例监听error事件,捕获连接异常,不要让异常冒泡到全局触发进程退出,同时可配置重连策略避免启动即失败。
示例代码(以ioredis为例):
const Redis = require('ioredis'); const redisClient = new Redis({ host: '127.0.0.1', port: 6379, // 关闭启动时强制连接校验 enableReadyCheck: false, // 单请求最大重试次数,避免无限重试占用资源 maxRetriesPerRequest: 3, // 重连间隔,单位毫秒 retryDelayOnFailover: 1000, }); // 捕获连接异常,不向外抛出 redisClient.on('error', (err) => { console.error('Redis连接异常,已降级为无缓存模式:', err.message); // 全局标记Redis状态 global.redisAvailable = false; }); // 连接成功更新状态 redisClient.on('connect', () => { console.log('Redis连接成功'); global.redisAvailable = true; });
2. 缓存逻辑增加降级判断
所有用到Redis缓存的GET接口,操作前先判断Redis可用状态,不可用时直接走原有的数据库查询逻辑,跳过缓存读写:
// 示例GET接口缓存逻辑 async function getDetail(id) { // Redis可用时才尝试读缓存 if (global.redisAvailable) { const cacheData = await redisClient.get(`detail:${id}`).catch(() => null); if (cacheData) return JSON.parse(cacheData); } // 缓存无数据/Redis不可用,直接查数据库 const dbData = await db.query('SELECT * FROM detail WHERE id = ?', [id]); // Redis可用时回写缓存 if (global.redisAvailable) { await redisClient.setEx(`detail:${id}`, 3600, JSON.stringify(dbData)).catch(() => {}); } return dbData; }
3. 可选:增加环境配置开关
开发环境不需要使用缓存时,可以在配置文件中新增开关,启动时直接跳过Redis初始化,完全不需要启动Redis服务:
// .env配置文件 USE_REDIS=false // 初始化逻辑 if (process.env.USE_REDIS === 'true') { // 执行Redis客户端初始化逻辑 } else { global.redisAvailable = false; }
修改完成后,即使Redis服务未启动,项目也可以正常启动运行,只是所有请求会直接访问数据库,不会使用缓存功能,Redis恢复后会自动切回带缓存的模式。
内容的提问来源于stack exchange,提问作者SUBHASH GIRI
相关产品推荐
相关产品推荐

