使用本地属性的redis.call错误

时间:2017-05-31 14:35:23

标签: lua 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]应该具有人员密钥,而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上我的脚本的第3行表示错误,我认为这是因为“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上出错,因为“属性”值是正确的,即“city:1”。

1 个答案:

答案 0 :(得分:0)

我想我刚刚发现错误。在这里做一些测试我在下面的代码中得到一个有趣的错误:

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) 

引起我注意的是错误的结束" ...(表值)"。 所以我改变了我的第一个代码,尝试将acess属性作为一个表:

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将一个值作为字符串或整数返回,但看起来并非如此。我还是不知道是不是因为我正在使用哈希,因为我设置了人:1和城市:1用HSET,或者如果它是如何Lua与redis的作品。

我希望这仍能帮助那些遇到与我同样麻烦的人。