我使用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
当我使用“时间”时,它报告错误:在非确定性命令之后不允许写入命令。 在互联网上搜索后,我添加'redis.replicate_commands()'作为lua脚本的第一行,但它仍然报告错误:ERR Error running script (call to f_c89a6ee8ad732a325e530f4a69226851cde302e2): @user_script:1: user_script:1: attempts to call场地“replicate_commands”(零值)
replicate_commands
需要争论还是有办法解决我的问题?
redis版本:3.0
jedis版本:2.9
lua版本:不知道去哪里找
错误 尝试调用字段 'replicate_commands'(零值) 意味着
replicate_commands()
不存在于 redis
对象中。这是Lua端的错误信息。
replicate_commands()
直到 Redis 3.2 才被引入。请参阅EVAL - 复制命令而不是脚本。考虑升级。
第一个错误消息(非确定性命令后不允许写入命令)是redis端消息,在调用非确定性命令(如SPOP、扫描、随机密钥、时间等)。
脚本编写的一个非常重要的部分是编写纯函数的脚本。 默认情况下,在 Redis 实例中执行的脚本会传播到 通过发送脚本本身(而不是发送脚本)来复制副本并发送到 AOF 文件 结果命令。
如果 Redis 服务器重新启动,再次播放 AOF 日志,或者如果在从属服务器中复制,则脚本应该传递相同的数据集。
这就是Redis 3.2中引入
replicate_commands()
的原因。从 Redis 5 开始,脚本总是被复制为效果——就好像脚本启动时调用了 replicate_commands()
一样。但对于 3.2 之前的版本,你根本无法这样做。
因此,要么升级到3.2或更高版本,要么将已经计算好的
currentKey
从客户端传递给脚本。
请注意,动态创建
currentKey
会使您的脚本仅限于单实例。
所有Redis命令在执行前必须进行分析以确定 该命令将在哪些键上运行。为了实现这一点 对于 EVAL,必须显式传递键。这在很多方面都很有用, 但特别是要确保 Redis 集群可以将您的请求转发到 适当的集群节点。
请注意,此规则并不是为了向用户提供 滥用 Redis 单实例配置的机会 编写与 Redis Cluster 不兼容的脚本的成本。
最后,Redis 3.0.0 的 Lua 版本是 Lua 5.1.5,一直到 Redis 6 RC1 都一样。
解决了吗? 据我所知,replicate_commands函数可以从Redis 6.0.0版本开始使用。 如果是Windows操作系统,看来你需要使用docker。