[英]Trigger Redis HMSET with LUA
我需要使用Redis Lua脚本调用Redis HMSET。 这是一个咖啡脚本:
redis = require("redis")
client = redis.createClient();
lua_script = "\n
-- here is the problem\n
local res = redis.call('hmset', KEYS[1],ARGV[1])\n
print (res)\n
-- create secondary indexes\n
--\n
--\n
return 'Success'\n
"
client.on 'ready', () ->
console.log 'Redis is ready'
client.flushall()
client.send_command("script", ["flush"])
args = new Array(3)
args[0] = '1111-1114'
args[1] = 'id'
args[2] = '111'
callback = null
#client.send_command("hmset", args, callback) # this works
client.eval lua_script, 1, args, (err, res) ->
console.log 'Result: ' + res
在LUA脚本中调用HMSET的正确语法/模式是什么? 顺便说一句-我知道redis.HMSET命令。
首先,确定您在CoffeeScript Redis库中正确使用了eval
吗? 您显然传递了三个参数:脚本,键的数量和数组。 我怀疑这不是它的工作方式。 如果这是node_redis,则数组中必须有所有内容或没有内容,因此请尝试:
args = new Array(5)
args[0] = lua_script
args[1] = 1
args[2] = '1111-1114'
args[3] = 'id'
args[4] = '111'
callback = null
client.eval args, (err, res) ->
console.log 'Result: ' + res
(可能有更好的语法,但我不知道CoffeeScript。)
其次,在此示例中,您尝试HMSET单个字段/值对:
HMSET lua_script 1111-1114 id 111
实际上,您可以在此处用HSET替换HMSET,但让我们先使其工作。
在这一行:
local res = redis.call('hmset', KEYS[1], ARGV[1])
您仅使用两个参数调用HMSET,密钥包含哈希值和字段。 您需要添加作为第二个参数的值:
local res = redis.call('hmset', KEYS[1], ARGV[1], ARGV[2])
这将使您的示例正常工作,但是如果您想像这样实际设置多个字段(这是MHSET的目标)怎么办?
HMSET lua_script 1111-1114 id 111 id2 222
在CoffeeScript中,您将编写:
args = new Array(7)
args[0] = lua_script
args[1] = 1
args[2] = '1111-1114'
args[3] = 'id'
args[4] = '111'
args[5] = 'id2'
args[6] = '222'
callback = null
client.eval args, (err, res) ->
console.log 'Result: ' + res
...但是现在您在ARGV
有四个要传递给Lua中的redis.call
元素。 实际上,您必须传递ARGV
所有元素,这在Lua中称为unpack() :
local res = redis.call('hmset', KEYS[1], unpack(ARGV))
使用唯一的问题unpack()
是,如果你有一个真正的很多元素ARGV
(千),它可以打破,因为它使栈溢出,在这种情况下,你应该使用一个循环中的Lua脚本调用HMSET在片ARGV
,但您可能暂时不必担心...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.