Redis time () иногда возвращает время в будущем - PullRequest
2 голосов
/ 07 октября 2019

В приведенном ниже коде Node.js timeDiff иногда отрицателен (примерно в 1% случаев). То есть Redis time() иногда возвращает время в несколько сотен миллисекунд в будущем по сравнению с 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();

1 Ответ

2 голосов
/ 08 октября 2019

Согласно redis docs для функции времени , эта функция возвращает массив, содержащий два значения:

  • unix time в секундах.
  • микросекунд.

Как вы знаете, значение микросекунды может быть числом от 0 до 999999. В вашем коде вы вычисляете миллисекунды из первых 3 цифр микросекунд!

Проблема именно здесь !! !

Чтобы вычислить миллисекунды, вы должны разделить микросекунды на 1000

, например, когда микросекунды равны 52369, это означает, что миллисекунды равны 52, но в вашейкод это рассчитывается как 523!

вы можете сделать что-то вроде этого:

const milliseconds = parseInt(data[1], 10)/1000|0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...