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, 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条件不可能无限写):em17:

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, 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
页: [1]
查看完整版本: [求助]关于redis内lua script的redis.call命令无法无法支持变参问题