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

在Express Node.js Web API中设置Redis键过期时间问题求助

问题分析与解决方案

首先,从你的代码和描述来看,有两个核心原因可能导致用SET + EX参数后get返回null,我们逐一排查解决:

1. node-redis客户端版本的命令参数格式不兼容

你当前使用的应该是较旧版本的node-redis(v3.x及以下),这类版本对SET命令的参数格式要求和Redis原生协议不一致:

  • 原生Redis的SET命令支持SET key value EX seconds这种位置式参数写法
  • 但旧版node-redis不认可这种格式,它要求把过期配置放在选项对象中传递

而SETEX命令之所以正常,是因为它的参数格式在旧版客户端中是明确支持的:client.setex(key, seconds, value, callback),完全匹配客户端的预期。

适配旧版客户端的解决方案

把SET命令的过期选项改成对象形式即可:

client.set(key+"1", JSON.stringify(data), { EX: 300 }, function (err, reply) {
  if (err) {
    console.error("设置缓存出错:", err);
    return;
  }
  console.log('set the key');
  console.log(reply);
});

如果后续你升级到node-redis v4+版本,它的API更贴近原生Redis,此时你原来的位置式参数写法就可以正常工作,但v4+默认使用Promise API,回调写法需要做对应调整。

2. 键名不匹配的潜在问题

观察你的代码逻辑:

  • 执行get时使用的键是req.params.id+'-v21'
  • 执行set(不管是setex还是set)时使用的键是key+"1"(即传入的key参数拼接了"1")

如果调用setExp时传入的key就是req.params.id+'-v21',那最终设置的键是req.params.id+'-v211',和get的键完全不同,自然会返回null。你说SETEX正常,可能是测试时键名刚好匹配,或者代码中存在未展示的键名统一逻辑?

验证与修复步骤

建议在set和get时都打印完整键名来验证一致性:

// 在getDataCache中打印获取的键
console.log("正在获取缓存键:", key);

// 在setExp中打印设置的键
const finalKey = key + "1";
console.log("正在设置缓存键:", finalKey);
client.set(finalKey, JSON.stringify(data), { EX: 300 }, function (err, reply) {
  // ...
});

如果发现键名确实不匹配,调整为统一的键名即可解决问题。

额外排查建议

  • 在SET命令的回调中加入错误处理,排查是否有命令执行失败的情况(比如权限、网络问题)
  • 登录Azure Redis控制台,查看缓存实例的命令执行日志,确认SET命令是否成功写入

内容的提问来源于stack exchange,提问作者Mukesh S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:52:05