2015-04-12 10 views
3

Существует ли какое-либо подобное поведение при передаче таблицы в один redis.call('HMGET',[key],...), а не зацикливание по таблице и запуск нескольких redis.call, один за другим?Lua скрипт в Redis: HMGET со столом?


У меня есть хеш-ключ в Redis, который представляет дерево Фенвика со 100000 элементами. Он имеет последовательные целые индексы и значения с плавающей точкой:

127.0.0.1:6379[1]> hmget fenwick 1 2 3 4 ... 
1) "0.75865226460558" 
2) "1.0234678955857959" 
3) "0.057608450324092272" 
4) "1.1002286486794375" 
... 

Я пытаюсь найти сумму до некоторой случайной записи entryid с помощью Redis' встроенного интерпретатора Lua. Очевидно, что наивный способ сделать это было бы выполнять одиночные доступы против таблицы по одному, как это:

local sum=0 
while entryid>0 do 
    sum=sum+redis.pcall('HGET',KEYS[1],temp) 
    entryid=entryid-bit.band(entryid,-entryid) 
end 

Я попытался сгенерировать и загрузить строку, чтобы сжать все команды в одну HMGET и уменьшить кругорейсы:

local evalstr="return redis.pcall('HMGET',KEYS[1]" 
local sum=0 
while entryid>0 do 
    evalstr=evalstr..','..temp 
    entryid=entryid-bit.band(temp,-temp) 
end 
local vals=loadstring(evalstr..')')() 
for i=1,#vals do 
    sum=sum+vals[i] 
end 

Однако накладные расходы компиляции не делают этот запрос медленнее, чем первый, независимо от того, какого размера fenwick есть.

По существу, я ищу такого поведения:

local tbl={} 
local c=1 
while temp>0 do 
    tbl[c]=temp 
    c=c+1 
    temp=temp-bit.band(temp,-temp) 
end 
local vals=redis.pcall('HMGET',KEYS[1],tbl) 
local sum=0 
for i=1,#vals do 
    sum=sum+vals[i] 
end 

Но очевидно, что это не работает. Есть ли способ собрать все значения, которые я хочу запросить в Redis в Lua, а затем отправить их в Redis одной командой?

+5

Посмотрите на Lua в распакованном - IIRC он делает то, что вы после –

+0

@ItamarHaber Да, это именно то, что я искал! 'redis.pcall ('HMGET', KEYS [1], unpack (tbl))' отлично работает. – concat

+0

Прохладный - я верну этот комментарий, написанный на мобильный, в ответ. –

ответ

3

Вы можете превратить таблицу Lua в ряд аргументов в VARIADIC функции с помощью встроенной в unpack функции.

В вашем случае, выполните следующие действия в вашем Lua скрипт:

redis.pcall('HMGET',KEYS[1],unpack(tbl)) 

 Смежные вопросы

  • Нет связанных вопросов^_^