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

