使用 openresty 调用 eval(“redis.call(“hmset”,key1 field1 value1 field2 value2)
测试通过啦,感谢agentzh老师。
代码如下:希望对其他人有帮助。
function get_eval_query(argsCount)
local keyTab={}
for i=1,argsCount do
keyTab[i]="ARGV["..i.."]"
end
local query="return redis.call('hmset',KEYS[1],"..table.concat(keyTab,",",1,argsCount-1)..") and redis.call('expire',KEYS[1],"..keyTab[argsCount]..")"
return query
end
function hmset(key,fields)
local ret=""
local dl=split(fields,",")
local dataTab={}
local t=os.time()
local n=1
for i=1,#dl do
dataTab[n]=dl[i]
dataTab[n+1]=t
n=n+2
end
dataTab[n]=60*60*24*60
local query=get_eval_query(#dataTab)
ngx.say(query)
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ok, err = red:connect(RedisServer, 6379)
if ok then
local res, err = red:eval(query,1,key,unpack(dataTab))
if res then
res="ok"
else
ngx.say(err)
end
red:set_keepalive(0, 500)
end
return ret
end
andex.li(李尊敬)
Email: and...@zhaopin.com.cn
Tel: (8610) 58635888 ext. 68504
-----邮件原件-----
发件人: openresty@googlegroups.com [mailto:openresty@googlegroups.com] 代表 Yichun Zhang (agentzh)
发送时间: 2013年11月21日 11:17
收件人: openresty
主题: Re: [openresty] openresty 调用redis eval 命令
Hello!
2013/11/20 andex.li:
> 使用 openresty 调用 eval(“redis.call(“hmset”,key1 field1 value1 field2 value2)
> “)
>
> 请问应该如何传参数?
>
Redis 命令的参数直接对应到 resty.redis 对象的同名 Lua 函数的参数。
比如 Redis 的 eval 命令的官方文档(http://redis.io/commands/eval )中的下面这个例子
eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
对应 resty.redis 对象的调用记法便是
red:eval("return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}", 2, "key1",
"key2", "first", "second")
而 Redis 文档中的下面这个例子
eval "return redis.call('set',KEYS[1],'bar')" 1 foo
OK
则对应 Lua 语句
red:eval("return redis.call('set',KEYS[1],'bar')", 1, "foo")
关于映射的更多细节,可以参见 lua-resty-redis 的官方文档:
https://github.com/agentzh/lua-resty-redis#methods
Regards,
-agentzh
--