首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试调用字段'replicate_commands‘(一个零值)

尝试调用字段'replicate_commands‘(一个零值)
EN

Stack Overflow用户
提问于 2020-01-19 10:27:28
回答 1查看 1.5K关注 0票数 1

我使用jedis + lua来评估脚本,下面是我的lua脚本:

代码语言:javascript
复制
    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版本:我不知道在哪里能找到

EN

回答 1

Stack Overflow用户

发布于 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的所有版本相同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59809151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档