首页 > 解决方案 > 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();

标签: node.jsredis

解决方案


根据redis docs for time function,此函数返回一个包含两个值的数组:

  • unix 时间以秒为单位。
  • 微秒。

如您所知,微秒值可以是 0 到 999999 之间的数字。在您的代码中,您是从微秒的前 3 位数字计算毫秒!

问题就在这里!!!

要计算毫秒,您应该将微秒除以 1000

例如,当微秒是52369,这意味着毫秒是52,但在你的代码中它计算为523

你可以这样做:

const milliseconds = parseInt(data[1], 10)/1000|0;

推荐阅读