Я просто наткнулся на интересное поведение окружающей среды Lua в Redis:Redis Lua Script math.random
У меня есть сценарий Lua делает несколько простых наборов операций и генерирующий уникальную метку времени, как идентификатор в конце сценария - использовать Redis в качестве временной метки оракула - как это:
...
local time = redis.call('TIME')
local millis = (tonumber(time[1]) * 1000) + math.floor(tonumber(time[2])/1000)
local version = string.format("%.0f",mills) .. string.format("%05d", math.random(99999))
Теперь version
что-то вроде этого: 145209287564117083
состоящих из метки времени и пяти случайных цифр в конце - по крайней мере, вот что я подумал.
Что происходит на самом деле, что пять случайных цифры в конце (порожденного math.random(99999)
не являются случайными вообще, но всегда цифры 17083
, независимо от того, как часто выполняется скрипт.
Для меня это было не так уж много (потому что я могу добавить случайные цифры после возвращения скрипта), но я не ожидал такого поведения, и поэтому мне нужно было найти некоторое время, чтобы найти ошибку.
Я надеюсь, что эта информация может сэкономить некоторое время.
Попробуйте '' 'math.randomseed (os.time())' '' в начале скрипта. – warspyking
@warspyking - не будет работать, потому что в песочнице Redis Lua нет библиотеки 'os' lib, и в любом случае Redis 'math.random' спроектирован таким образом, чтобы при использовании репликации на основе сценариев были получены одинаковые значения (единственный режим, доступный до v3.2) –
@Itamar Ну, это действительно может быть все, что постоянно меняется. Не обязательно '' 'os.time'''. – warspyking