我使用jedis + lua来评估脚本,下面是我的lua脚本:
redis.replicate_commands()
local second = redis.call('TIME')[1]
local currentKey = KEYS[1]..second
if redis.call('EXISTS', currentKey) == 0 then
redis.call('SETEX', currentKey, 1, 1)
return 1
else
return redis.call('INCR', currentKey)
end当我使用'Time‘时,它会报告错误:在非确定性命令之后不允许使用编写命令。在互联网上搜索后,我添加了'redis.replicate_commands()‘作为lua脚本的第一行,但是它仍然报告了错误:错误运行脚本(调用f_c89a6ee8ad732a325e530f4a69226851cde302e2):@user_script:1: user_script:1:尝试调用字段'replicate_commands’(一个零值)
replicate_commands需要争论还是有办法解决我的问题?
redis版本:3.0
吉迪斯版本:2.9
lua版本:我不知道在哪里能找到
发布于 2020-01-20 06:37:20
错误试图调用字段'replicate_commands‘(一个零值)意味着replicate_commands()不存在于redis对象中。这是一个Lua端错误消息。
replicate_commands()被引入,直到Redis3.2。见EVAL -复制命令而不是脚本。考虑升级。
第一个错误消息(写命令在非确定性命令之后不允许)是一条红线消息,您不能在调用非确定性命令(如SPOP、、RANDOMKEY、TIME等)之后调用写命令(如SET、SETEX、INCR等)。
脚本的一个非常重要的部分是编写纯函数的脚本。默认情况下,在Redis实例中执行的脚本通过发送脚本本身传播到副本和AOF文件--而不是结果命令。
如果Redis服务器重新启动、再次播放AOF日志,或者如果在从服务器中复制,则脚本应该提供相同的数据集。
这就是为什么在Redis3.2中引入了replicate_commands()。从Redis 5开始,脚本总是被复制为效果--就像脚本启动时调用了replicate_commands()一样。但是对于3.2之前的版本,您根本不能这样做。
因此,要么升级到3.2或更高版本,要么将currentKey从客户端传递给已经计算出来的脚本。
请注意,动态创建currentKey使您的脚本仅限于单个实例。
执行前必须对所有Redis命令进行分析,以确定该命令将对哪些键进行操作。为了使EVAL为真,必须显式传递键。这在许多方面都很有用,但尤其是为了确保Redis集群能够将请求转发到适当的集群节点。 注意,为了向用户提供滥用Redis单实例配置的机会,不强制执行此规则,代价是编写与Redis群集不兼容的脚本。
最后,Redis 3.0.0的Lua版本是Lua 5.1.5,与Redis 6 RC1的所有版本相同。
https://stackoverflow.com/questions/59809151
复制相似问题