2015-09-20 2 views
2

Я использую NodeJs.Как сделать миллисекунду уникальной?

Я получил постоянный запрос с сервера. Я добавил к нему некоторую переменную типа createdTime и сохранил ее в базе данных. , когда я отсортировал данные по createdTime в некоторых случаях Не является надежным, он повторяется

Как я могу провести различие между ними?

  • Я не хочу считать запрос.
  • Мне не нравится изменять формат метки времени.

var createdTime = new Date(). GetTime();

+1

Почему бы не сохранить его как NOW() в запросе SQL вместо передачи его в качестве параметра , –

+0

@BasvanStein Время для клиента браузера, является местным временем. он может захотеть сохранить это время. (хотя я думаю, что UTC следует сохранить), но он может захотеть использовать это конкретное время. –

+0

Не меняя тип на строку или другой формат, вы не сможете этого сделать. Похож на поток дизайна здесь. –

ответ

3

Вот метод комбинирования счетчик с текущим временем, чтобы позволить вам иметь до 1000 отдельных транзакций в пределах одних и тех же ms, которые все однозначно пронумерованы, но все же значение времени.

И вот рабочий фрагмент для иллюстрации:

// this guarantees a unique time-based id 
 
// as long as you don't have more than 1000 
 
// requests in the same ms 
 
var getTransactionID = (function() { 
 
    var lastTime, counter = 0; 
 
    return function() { 
 
    var now = Date.now(); 
 
    if (now !== lastTime) { 
 
     lastTime = now; 
 
     counter = 0; 
 
    } else { 
 
     ++counter; 
 
    } 
 
    return (now * 1000) + counter; 
 
    } 
 
})(); 
 

 
for (var i = 0; i < 100; i++) { 
 
    document.write(getTransactionID() + "<br>"); 
 
}

Если вы хотите что-то, что, скорее всего, работать по кластерам, вы можете использовать process.hrtime() использовать высокое разрешение таймера вместо счетчик, а затем сделать id строкой, которая может быть проанализирована в относительное время, если это необходимо. Поскольку это требует Node.js, я не могу сделать рабочий фрагмент кода здесь в браузере, но вот идея:

// this makes a unique time-based id 
function getTransactionID() { 
    var now = Date.now(); 
    var hrtime = process.hrtime(); 
    return now + "." + ((hrtime[0] * 1e9) + hrtime[1]); 
} 
+0

Повторяется @ jfriend00 – Alyreza

+0

Одной вещью, которую следует учитывать при сохранении точности мс, является то, что кластер может легко получить удар дважды в миллисекундах, что приведет к дублированию, тогда как добавление hrtime делает повторение намного менее вероятным при умеренных нагрузках. – dandavis

+0

@Alyreza - показать мне, как это можно было повторить? Вы серьезно получаете более 1000 запросов за миллисекунду? Покажите мне сервер, который может это сделать. Если вам нужно большее число, чем 1000, то увеличьте число в коде - просто, как это, но я скорее сомневаюсь, что это проблема реального мира. – jfriend00

1

Из-за моей низкой репутации я не могу добавить комментарий, но это выглядит, как вы необходимости выходить за пределы milliseconds.Maybe этот StackOverflow вопрос может помочь вам

How to get a microtime in Node.js?

Смежные вопросы