【发布时间】:2016-07-09 06:08:30
【问题描述】:
我刚刚在 Redis 中遇到了 Lua 环境的一个有趣行为:
我有一个 Lua 脚本,它执行一些简单的集合操作并在脚本末尾生成一个唯一的时间戳,如 id - 将 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 - 不起作用,因为 Redis Lua 沙箱没有
os库,而且在任何情况下,Redis 的math.random被设计为在使用时产生相同的值基于脚本的复制(v3.2 之前唯一可用的模式) -
@Itamar 嗯,它真的可以是任何不断变化的东西。不一定是
os.time。