我在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”。
答案 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的作品。
我希望这仍能帮助那些遇到与我同样麻烦的人。