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