Redis列表出现'Unifinity'值问题排查求助
排查Redis列表中"Unifinity"值的实用思路
1. 从数据写入代码入手排查
- 先盯死
RPUSH的数据源:检查Node.js代码里生成待写入值的逻辑,有没有可能在计算溢出、异常场景下生成了"Unifinity"字符串?比如是不是把JS里的Infinity拼写错成了"Unifinity"? - 排查所有写入该列表的代码分支,包括异常处理块:比如捕获错误时会不会误把错误占位符或调试字符串设成"Unifinity"并写入了列表?
- 临时加日志记录所有写入操作,方便定位触发场景:
const targetValue = getCalculatedValue(); // 你的业务取值逻辑 console.log(`[Redis Push] Value: ${targetValue}, Type: ${typeof targetValue}`); redisClient.rpush('your-target-list', targetValue, (err) => { /* 原有回调逻辑 */ });
2. 验证Redis操作的原子性(顺带优化现有逻辑)
你当前用LLEN+LPOP的非原子逻辑,虽然和"Unifinity"无关,但并发写入时可能导致列表长度超出100。可以改成Lua脚本实现原子操作,同时避免后续潜在问题:
redis.call('RPUSH', KEYS[1], ARGV[1]) if redis.call('LLEN', KEYS[1]) > 100 then redis.call('LPOP', KEYS[1]) end
Node.js里用eval执行这个脚本即可,核心还是先解决"Unifinity"的问题,这个属于优化项。
3. 直接监控Redis的写入行为
- 用Redis CLI执行
LRANGE your-target-list 0 -1,查看"Unifinity"出现的位置、频率,判断是集中触发还是随机出现。 - 开启
MONITOR命令实时抓所有Redis操作,看有没有其他客户端(比如运维工具、其他服务)误写入该列表:
这个命令会输出所有执行的Redis命令,能直接看到谁在往列表里写值。redis-cli MONITOR
4. 版本与依赖排查
- Redis 3.0.504是比较老的版本,但直接导致写入"Unifinity"的概率极低,重点还是看Node.js侧的依赖:有没有使用的计算类第三方库,在特定输入下返回了"Unifinity"字符串?比如库的拼写错误把"Infinity"写成了"Unifinity"?
临时规避方案
如果暂时找不到根源,可以先在读写环节过滤该值:
- 写入前过滤:
const targetValue = getCalculatedValue(); if (targetValue !== 'Unifinity') { // 执行RPUSH及后续长度控制逻辑 } - 读取时过滤:
redisClient.lrange('your-target-list', 0, -1, (err, values) => { const validNumbers = values.filter(v => v !== 'Unifinity').map(v => parseFloat(v)); // 进行数值计算 });
内容的提问来源于stack exchange,提问作者Kensoft2000
相关产品推荐
相关产品推荐

