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

本地Redis缓存存值后跨文件取值返回Null问题求助

问题分析与排查方案

1. 优先排查:过期时间单位错误(最可能的原因)

从你提供的redis-cli monitor日志可以看到,set命令的过期参数是"PX" "3600":

1695508290.121830 [0 127.0.0.1:62717] "set" 
"cache:CacheClass:fd3ac352f825aba7852adcb77a5613f11fea3d101cfd516c93cf07b9ac37c5cf" 
"{\"id\":\"e08f7b78-4f6e-415d-b03a-d0e68cecd0e7\",
"userId\":\"me\",
\"location\":{\"latitude\":49.25228920000001,\"longitude\":-123.1222096}}" "PX" "3600"
  • PX代表毫秒单位,3600毫秒仅为3.6秒,远短于你预期的1小时。
  • 同一个文件内存完立刻取值时,key还未过期,所以能拿到;15秒后(日志中get请求的时间差)key已自动过期删除,因此返回null,且redis-cli查不到该key。

解决方法:

  • 将过期时间改为3600000(1小时=3600秒=3600*1000毫秒),保持PX参数;
  • 或者改用EX参数(秒单位),传入3600。

2. 检查Redis客户端实例一致性

同一个文件能取值、其他文件不行,可能是不同文件使用了不同的Redis客户端实例,导致配置不一致(比如误连了其他DB、端口)。

  • 排查:确保所有文件复用同一个Redis客户端实例(比如通过单例模式导出,而非每次新建连接);
  • 验证:在存值和取值的代码中,打印客户端的db属性和连接配置,确认完全一致。

3. 检查Key的隐形字符

虽然日志中key看起来相同,但可能存在隐形空白字符(如空格、换行、Unicode零宽度空格),导致实际key不一致。

  • 验证:在存值和取值的代码中,将key转换为十六进制字符串对比:
    console.log('Set key hex:', Buffer.from(setKey).toString('hex'));
    console.log('Get key hex:', Buffer.from(getKey).toString('hex'));
    
  • 如果十六进制结果不同,说明存在隐形字符,需要检查key生成逻辑(比如是否从带换行的字符串中截取、拼接时引入了多余字符)。

4. 检查命令执行完整性

确认set操作的代码已正确执行:

  • 如果使用了Redis管道(pipeline)或事务(multi),必须调用exec()才能将命令发送到Redis;
  • 如果是异步操作,确保用await等待set操作完成,避免后续取值时命令还未执行。

5. 排查是否有其他操作删除Key

用redis-cli monitor持续观察,看set命令之后到get命令之间,是否有del或unlink命令删除了目标key,可能是其他业务逻辑的缓存清理代码导致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:40:24