运维开发网

redis:EVAL和TIME

运维开发网 https://www.qedev.com 2020-06-01 19:53 出处:网络 作者:运维开发网整理
我喜欢redis的Lua脚本,但我对TIME有很大的问题. 我将事件存储在SortedSet中. 得分是时间,因此在我的应用程序中,我可以在给定的时间窗口中查看所有事件. redis.call('zadd', myEventsSet, TIME, EventID); 好的,但这不起作用 – 我无法访问TIME(Servertime). 有没有办法从服务器获取时间而不将其作为我的lua脚本的参数传递
我喜欢redis的Lua脚本,但我对TIME有很大的问题.

我将事件存储在SortedSet中.

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

redis.call('zadd', myEventsSet, TIME, EventID);

好的,但这不起作用 – 我无法访问TIME(Servertime).

有没有办法从服务器获取时间而不将其作为我的lua脚本的参数传递?或者将时间作为参数传递最佳方式?

这是明确禁止的(据我记得).这背后的原因是你的lua函数必须是确定性的,并且只依赖于它们的参数.如果这个Lua调用被复制到具有不同系统时间的从服务器怎么办?

编辑(作者Linus G Thiel):这是正确的.从redis EVAL docs:

Scripts as pure functions

A very important part of scripting is writing scripts that are pure functions. Scripts executed in a Redis instance are replicated on slaves by sending the script — not the resulting commands.

[…]

In order to enforce this behavior in scripts Redis does the following:

  • Lua does not export commands to access the system time or other external state.
  • Redis will block the script with an error if a script calls a Redis command able to alter the data set after a Redis random command like RANDOMKEY, SRANDMEMBER, TIME. This means that if a script is read-only and does not modify the data set it is free to call those commands. Note that a random command does not necessarily mean a command that uses random numbers: any non-deterministic command is considered a random command (the best example in this regard is the TIME command).

有很多关于它为什么的信息,如何在不同的场景中处理这个问题,以及脚本可以使用哪些Lua库.我建议你阅读整个文档!

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号