由于Redis的Lua脚本不能使用Lua的一些系统变量,是因为Redis使用的是LuaJIT,而不是标准的Lua解释器。LuaJIT为了提高性能,对标准Lua进行了一些修改和优化,其中之一就是禁用了一些Lua的系统变量和函数,其中就包括data命令,那么我们该如何通过redis获取当前的服务器时间呢?
redis为我们提供了一个命令:TIME,它的返回结果有两个,第一个是Unix纪元(1970年1月1日 00:00:00 UTC)至当前时间的总秒数,第二个时间是当前时间的微秒数:
Lua脚本可编写为:
local time = redis.call('TIME') -- time是一个长度为2的数组
获取当前时间以秒为单位的时间戳:
local seconds = tonumber(time[1])
获取当前时间以毫秒为单位的时间戳:
local milliseconds = time[1] * 1000 + math.floor(time[2] / 1000)
获取当前时间以微秒为单位的时间戳:
local microseconds = tonumber(time[1] .. string.format("%06d", time[2]))
注:这里使用了字符串拼接,先将微秒转换为6位,再与总秒数拼接在一起,最后转换为数字类型