Существует ли какое-либо подобное поведение при передаче таблицы в один 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 одной командой?
Посмотрите на Lua в распакованном - IIRC он делает то, что вы после –
@ItamarHaber Да, это именно то, что я искал! 'redis.pcall ('HMGET', KEYS [1], unpack (tbl))' отлично работает. – concat
Прохладный - я верну этот комментарий, написанный на мобильный, в ответ. –