Time redis:评估和时间

Time redis:评估和时间,time,lua,redis,eval,Time,Lua,Redis,Eval,我喜欢redis的Lua脚本,但我在时间上有一个大问题 我将事件存储在分类数据集中 分数是时间,因此在我的应用程序中,我可以查看给定时间窗口中的所有事件 redis.call('zadd', myEventsSet, TIME, EventID); 好的,但这不起作用-我无法访问时间(Servertime) 有没有办法从服务器获取时间而不将其作为参数传递给我的lua脚本?还是把时间作为争论来度过是最好的方式呢?这是明确禁止的(据我记忆所及)。这背后的原因是,lua函数必须是确定性的,并且只依赖

我喜欢redis的Lua脚本,但我在时间上有一个大问题

我将事件存储在分类数据集中

分数是时间,因此在我的应用程序中,我可以查看给定时间窗口中的所有事件

redis.call('zadd', myEventsSet, TIME, EventID);
好的,但这不起作用-我无法访问时间(Servertime)


有没有办法从服务器获取时间而不将其作为参数传递给我的lua脚本?还是把时间作为争论来度过是最好的方式呢?

这是明确禁止的(据我记忆所及)。这背后的原因是,lua函数必须是确定性的,并且只依赖于它们的参数。如果此Lua调用被复制到具有不同系统时间的从机,会怎么样

编辑(由Linus G Thiel):这是正确的。从:

作为纯函数的脚本 脚本编写的一个非常重要的部分是编写纯函数脚本。在Redis实例中执行的脚本通过发送脚本(而不是结果命令)在从属服务器上复制

[……]

为了在脚本中强制执行此行为,Redis执行以下操作:

  • Lua不会导出命令以访问系统时间或其他外部状态
  • 如果脚本调用一个Redis命令,该命令能够在Redis随机命令(如RANDOMKEY、SRANDMEMBER、TIME)之后更改数据集,那么Redis将用错误阻塞脚本。这意味着,如果脚本是只读的,并且不修改数据集,则可以自由调用这些命令。请注意,随机命令并不一定意味着使用随机数的命令:任何非确定性命令都被视为随机命令(这方面的最佳示例是时间命令)

关于这是为什么,如何在不同的场景中处理,以及脚本可以使用哪些Lua库,有大量的信息。我建议您阅读整个文档

同时还有时间。有了lua你就可以把它包在zadd身上了<代码>127.0.0.1:6379>eval“local t=(redis.call('time'));返回t[1]“0”1438894559“