You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:18:00