Redis 调用本地属性出错

我在 Redis 中有以下早期注册过的数值数据库:

person:1 {city city:1 }
city:1 {name Brasilia}

我有一个 Lua 脚本来获取特定人员的城市名称:

redis.call("SELECT", 5)
local attribute = redis.call("HMGET", KEYS[1], ARGV[1])
local value = redis.call("HMGET", attribute, "name")
return value

其中 KEYS[1] 应该是人员的 key,而 ARGV[1] 是该人员的属性,在这种情况下,我假设它是城市。

但当我用以下命令运行脚本时:

$ redis-cli --eval redis_script.lua person:1 , city

我会收到以下错误消息:

(error) ERR Error running script (call to f_8b79864f056e62eadd87b14b98e43c3457971911): @user_script:3: @user_script: 3: Lua redis() command arguments must be strings or integers

这意味着我的 redis.call 的第三行出错,我想这是因为“attribute”值无效。所以我改变了我的脚本来找到“attribute”的值:

redis.call("SELECT", 5)
local attribute = redis.call("HMGET", KEYS[1], ARGV[1])
return attribute

该脚本返回:

redis-cli --eval redis_script.lua person:1 , city
1) "city:1"

然后我又把代码变成了这样:

redis.call("SELECT", 5)
local attribute = redis.call("HMGET", KEYS[1], ARGV[1])
local value = redis.call("HMGET", "city:1", "name")
return value

这让我得到了想要的结果:

redis-cli --eval another_test.lua person:1 , city
1) "Brasilia"

但我不明白为什么我的第一段代码在 redis.call 中出错,因为“attribute”值是正确的,也就是“city:1”。

点赞
用户4252525
用户4252525

我想我刚刚找到了错误。在这里执行一些测试,我在以下代码中得到了一个有趣的错误:

redis.call("SELECT", 5)
local attribute = redis.call("HMGET", KEYS[1], ARGV[1])
local message = "City: ".. " " ..attribute
return message

执行它:

redis-cli --eval test.lua person:1 , city
(error) ERR Error running script (call to f_03b059b49498769b0110c9f44765d1b769cb6976): @user_script:3: user_script:3: attempt to concatenate local 'attribute' (a table value)

引起我的注意的是错误的末尾 "...(a table value)"。所以我更改了我的第一个代码来尝试将attribute作为表访问:

redis.call("SELECT", 5)
local attribute = redis.call("HMGET", KEYS[1], ARGV[1])
local value = redis.call("HMGET", attribute[1], "name")
return value

这给了我:

redis-cli --eval redis_script.lua person:1 , city
1) "Brasilia"

所以问题就在于我还没有正确理解Lua如何使用Redis。起初看起来redis.call返回一个字符串或整数值,但看来不是这样。我仍然不知道是否因为我使用了哈希,因为我使用了HSET设置了person:1和city:1,或者是否仅仅是Lua与redis的工作方式。

我希望这仍然可以帮助与我遇到相同麻烦的人。

2017-05-31 14:52:04