2013-08-25 158 views
0

我需要用Redis Lua腳本調用Redis HMSET。這是一個咖啡腳本:用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命令。

+0

我是新的在redis中使用lua,但是您可能需要使用'unpack'。我用它[我在這裏]發佈的代碼(http://codereview.stackexchange.com/questions/30195/redis-rate-limiting-in-lua),儘管我將它用於'HMGET'。 – JesseBuesking

+0

順便說一下這是'Lua'而不是'LUA' –

回答

0

首先,您確定您的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 元素傳遞給redis.call在Lua。事實上,你必須通過所有的的ARGV元素,這是在Lua稱爲unpack()

local res = redis.call('hmset', KEYS[1], unpack(ARGV)) 

使用unpack()唯一的問題是,如果你有ARGV(幾千真正很多元素)它可能會因爲溢出堆棧而中斷,在這種情況下,您應該在Lua腳本中使用循環來調用ARGV切片上的HMSET,但您現在可能不應該擔心這一點...