不允许在lua中执行SPOP。如果首先执行一些非确定性命令,则不允许执行写命令。这对我来说似乎很困惑。那么为什么redis有这样的限制?
答案 0 :(得分:3)
在Redis docs here中解释得相当不错。
通过在从属设备上发送脚本并在其上运行脚本,将脚本复制到从属设备,因此脚本需要在每次运行时始终生成相同的结果,否则从属设备上的数据将与数据分离在主人身上。
您可以尝试新的'脚本效果复制'如果您需要在脚本中执行非确定性操作,请在同一链接中。
答案 1 :(得分:1)
答案 2 :(得分:0)
在单个Redis实例上,我无法想到任何负面影响。
但是说你正在运行一些主从设置。那些调用例如lua脚本的结果主人的时间不一样。
答案 3 :(得分:0)
您可以像错误描述最后部分中建议的那样进行操作
其他信息:ERR错误运行脚本(调用 f_082d853d36ea323f47b6b00d36b7db66dac0bebd):@user_script:10: @user_script:10:确定性后不允许写命令 命令。在脚本开头调用redis.replicate_commands() 为了切换到单命令复制模式。
在脚本的开头调用redis.replicate_commands()以便切换到单个命令复制模式。 请注意,由于redis.call('time')的调用是不确定的。
local function ticks(key,ticks)
redis.replicate_commands()
local t = ticks
local time = redis.call('time')
local last=redis.call('get',key..'_last')
if last==t then
local inc=redis.call('incr',key..'cnt')
t = t+inc
else
redis.call('set',key..'cnt',0)
end
redis.call('set',key..'_last',t)
return t
end
return ticks(@key,@ticks)