Tho*_*sch 7 time lua eval redis
我喜欢redis的Lua脚本,但我对TIME有很大的问题.
我将事件存储在SortedSet中.
该得分的时候,所以,在我的应用程序可以查看在给定的时间窗口中的所有事件.
redis.call('zadd', myEventsSet, TIME, EventID);
Run Code Online (Sandbox Code Playgroud)
好的,但这不起作用 - 我无法访问TIME(Servertime).
有没有办法从服务器获取时间而不将其作为我的lua脚本的参数传递?或者把时间作为争论的最佳方式?
Ser*_*sev 12
这是明确禁止的(据我记得).这背后的原因是你的lua函数必须是确定性的,并且只依赖于它们的参数.如果这个Lua调用被复制到具有不同系统时间的从服务器怎么办?
编辑(由Linus G Thiel撰写):这是正确的.来自redis EVAL文档:
脚本作为纯函数
脚本编写的一个非常重要的部分是编写纯函数的脚本.通过发送脚本而不是生成的命令,在Redis实例中执行的脚本将复制到从属服务器上.
[...]
为了在脚本中强制执行此行为,Redis执行以下操作:
- Lua不会导出命令来访问系统时间或其他外部状态.
- 如果脚本调用Redis命令能够在Redis随机命令(如RANDOMKEY,SRANDMEMBER,TIME)之后更改数据集,则Redis将阻止脚本出错.这意味着如果脚本是只读的并且不修改数据集,则可以自由调用这些命令.请注意,随机命令不一定意味着使用随机数的命令:任何非确定性命令都被视为随机命令(这方面的最佳示例是TIME命令).
有很多关于它为什么的信息,如何在不同的场景中处理这个问题,以及脚本可以使用哪些Lua库.我建议你阅读整个文档!