在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
相关产品推荐
相关产品推荐

