node.js - Redis time() 有时会返回未来的时间
问题描述
在下面的 Node.js 代码中,timeDiff
有时是负数(大约 1% 的时间)。也就是说time()
,与 相比,Redis 有时会返回几百毫秒的时间Date.now()
,即使 Redis 实例位于同一 AWS 虚拟机上,并且Date.now()
在成功接收到 Redis 的响应后被调用。
这是预期的吗?考虑到频率和差异(有时接近一秒),它可能是由 NTP 引起的吗?
不幸的是,我什至找不到 Redis time() 函数的源代码,因此帮助查找它也会很有用。
const redis = require("redis");
const Bluebird = require("bluebird");
Bluebird.promisifyAll(redis);
const redisClient = redis.createClient(LOCAL_PORT, LOCAL_HOST);
function runNext() {
logRedisLatency().finally(() => {
setTimeout(runNext, 20 * 1000);
});
}
function logRedisLatency() {
return redisClient.timeAsync().then((data) => {
const timeDiff = Date.now() - parseRedisTime(data);
console.log(timeDiff);
});
}
function parseRedisTime(data) {
const seconds = parseInt(data[0], 10);
const milliseconds = parseInt(data[1].substr(0, 3), 10);
const time = (seconds * 1000) + milliseconds;
return time;
}
runNext();
解决方案
根据redis docs for time function,此函数返回一个包含两个值的数组:
- unix 时间以秒为单位。
- 微秒。
如您所知,微秒值可以是 0 到 999999 之间的数字。在您的代码中,您是从微秒的前 3 位数字计算毫秒!
问题就在这里!!!
要计算毫秒,您应该将微秒除以 1000
例如,当微秒是52369
,这意味着毫秒是52
,但在你的代码中它计算为523
!
你可以这样做:
const milliseconds = parseInt(data[1], 10)/1000|0;