修复:Lua script attempted to access a non local key in a cluster node

local key = "rate.limit:" .. KEYS[1]
local limit = tonumber(ARGV[1]) 
local current = tonumber(redis.call('get', key) or "0")
if current + 1 > limit then
 return 0 
else 
 redis.call("INCR", key)
 redis.call("expire", key,ARGV[2])
 return current + 1 
end

上面脚本,在linux,redis集群下执行会报错:

Lua script attempted to access a non local key in a cluster node

修改脚本为:

local key = KEYS[1]
local limit = tonumber(ARGV[1]) 
local current = tonumber(redis.call('get', key) or "0")
if current + 1 > limit then
 return 0 
else 
 redis.call("INCR", key)
 redis.call("expire", key,ARGV[2])
 return current + 1 
end

可正常执行

避免踩坑

在redis-cli命令行中执行lua脚本的时候,要注意 KEY和ARGV的位置

 在lock_testLock后面没有空格的话会报错:

(error) CROSSSLOT Keys in request don't hash to the same slot
正确的应该是:

 

这个错误是因为 Redis 在执行 Lua 脚本时,不允许访问 Lua 标准库中的一些模块和函数,包括 `io` 模块。因此,在 Lua 脚本中使用 `io` 模块时,会报错提示无法访问该模块。 如果你需要在 Redis 中执行类似于 `io.popen` 等需要访问 `io` 模块的操作,可以使用 Redis 提供的 `redis.call` 函数来代替。`redis.call` 函数是 Redis 提供的一个 Lua 函数,用于调用 Redis 命令。你可以将 shell 命令封装成 Redis 命令,然后通过 `redis.call` 函数来执行该命令。例如: ```lua -- 定义 Lua 脚本 local cmd = "ls" local result = redis.call("execute", "system", cmd) return result -- 在 Redis 中执行脚本 EVAL "local cmd = 'ls'; local result = redis.call('execute', 'system', cmd); return result;" 0 ``` 在这个示例中,Lua 脚本中使用了 Redis 提供的 `redis.call` 函数来调用 `execute` 命令。`execute` 命令是 Redis 的自定义命令,用于执行 shell 命令。你可以将要执行的 shell 命令作为参数传递给 `execute` 命令,然后通过 `redis.call` 函数来执行该命令。 需要注意的是,使用 `execute` 命令需要在 Redis 配置文件中设置 `lua-allow-unbouded-commands` 选项为 `yes`,否则会提示错误 "ERR unknown command 'execute'"。这个选项的作用是允许执行任意 Redis 命令,包括自定义命令和 Lua 脚本中未定义的函数。因此,在使用 `execute` 命令时,需要注意安全性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值