我刚刚发现了Redis中Lua环境的一个有趣行为:
我有一个Lua脚本执行一些简单的集合操作,并在脚本末尾生成一个唯一的时间戳ID,以便将Redis用作时间戳Oracle - 就像这样:
...
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())
。 - warspykingos
库,而且无论如何,当使用基于脚本的复制(在v3.2之前唯一可用的模式)时,Redis的math.random
被设计为产生相同的值。 - Itamar Haberos.time
。 - warspyking