Chinaunix

标题: [求助]关于redis内lua script的redis.call命令无法无法支持变参问题 [打印本页]

作者: dyshowgood    时间: 2013-10-20 21:36
标题: [求助]关于redis内lua script的redis.call命令无法无法支持变参问题
最近在学习redis,发现其lua功能强大,想用lua script来解决频繁访问server,减少网络开销功能
数据构成如下:
通过key1获取到key2,key1的类型为set或者list,也就是key2可能有多个。真正要获取的数据由key2指定。
key1---->key2_1----->value1
         key2_2----->value2
         key3_3----->value3
         ......

1. 插入数据:
lpush index_key1 index_key2_1
lpush index_key1 index_key2_2
lpush index_key1 index_key2_3
set index_key2_1 data_value1
set index_key2_2 data_value2
set index_key2_3 data_value3


2. 创建一个lua脚本 例如 getkeytokeys.lua

local list,z,x,y=redis.call('LRANGE', KEYS[1], 0, -1),''
for x,y in ipairs(list) do
z=z..'|'..redis.call('GET', y)
end
return (z)

3. 执行如下命令(该测试redis建立的端口为6378):
redis-cli -p 6378 EVAL "$(cat shell/getkeytokeys.lua)" 1 index_key1

得到如下结果:
"|data_value3|data_value2|data_value1"
而实际上我是想得到mget的效果
mget index_key2_1 index_key2_2 index_key2_3
期望结果:
1) "data_value1"
2) "data_value2"
3) "data_value3"

原因就是redis.call不支持变参传入,而且只有一个返回值
请各位专家指点下,该如何达到上述效果(硬写获取到key的个数方式不妥,实际过程中可能得到的list链表长度超过20甚至更长,if条件不可能无限写)
作者: bikong0411    时间: 2013-10-21 09:26
你写的lua脚本就是返回LRANGE的结果然后以|分割的啊
作者: dyshowgood    时间: 2013-10-21 09:43
我希望的是能用mget直接获取到redis server主动分序的结果,而不想通过切割分隔符"|"来得到结果。
作者: dyshowgood    时间: 2013-10-22 10:02
呃 搞定了,提供下思路给大家了

eval "local list = redis.call('LRANGE', KEYS[1], 0, -1)
local a = {};
local res;
for key,value in pairs(list) do
res = redis.call('GET', value)
table.insert(a, res)
end;
return a" 1 index_key1





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2