一次性多次获取 - Redis

时间:2015-02-26 04:01:27

标签: lua redis jedis

我们如何使用lua脚本来实现multi-get。

如果我将name_last设置为贝克汉姆并name_first设置为David,请说。为了同时获得name_lastname_first,lua脚本应该是什么?

我可以实现类似的东西:

eval "return redis.call('get',KEYS[1])" 1 foo

获取单键的值。只是想知道如何通过只调用一次redis服务器来增强脚本部分获取与所有键(或多个键)相关的值。

2 个答案:

答案 0 :(得分:4)

首先,您要将要返回的字段发送到EVAL0表示没有KEYS,因此可以从ARGV访问这些参数):

eval "..." 0 name_last name_first

其次,您可以使用MGET查询各个字段的值:

local values = redis.call('MGET', unpack(ARGV))

第三,您可以将值映射回字段名称(每个值的索引对应于相同的字段):

local results = {}
for i, key in ipairs(ARGV) do
  results[key] = values[i]
end
return results

您最终执行的命令将是:

eval "local values = redis.call('MGET', unpack(ARGV)); local results = {}; for i, key in ipairs(ARGV) do results[key] = values[i] end; return results" 0 name_last name_first

答案 1 :(得分:3)

在KEYS表上循环,并为每个商店执行其返回的获取中的GET响应。未经测试的代码:

local t = {}
for _, k in pairs(KEYS) do
  t[#t+1] = redis.call('GET', k)
end
return t

P.S。您也可以使用MGET代替btw:)