为什么redis无法在lua脚本中执行非确定性命令

时间:2016-10-13 06:15:48

标签: lua redis

不允许在lua中执行SPOP。如果首先执行一些非确定性命令,则不允许执行写命令。这对我来说似乎很困惑。那么为什么redis有这样的限制?

4 个答案:

答案 0 :(得分:3)

在Redis docs here中解释得相当不错。

通过在从属设备上发送脚本并在其上运行脚本,将脚本复制到从属设备,因此脚本需要在每次运行时始终生成相同的结果,否则从属设备上的数据将与数据分离在主人身上。

您可以尝试新的'脚本效果复制'如果您需要在脚本中执行非确定性操作,请在同一链接中。

答案 1 :(得分:1)

您需要在任何数据更改命令

之前运行此复制命令功能
redis.replicate_commands()

解释here

答案 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)