Несколько HMSET для Redis с помощью скрипта Lua

Из-за производительности мне нужно минимизировать количество прыжков на Redis. Я вызываю HMSET несколько раз из кода C++, и я исследую, возможно ли изменить это с помощью сценария Lua и установить несколько хеш-ключей Redis с помощью одного вызова Redis:

HMSET myhash1 field1 "Hello" field2 "World"
HMSET myhash2 field1 "Hello" field2 "World"
HMSET myhash3 field1 "Hello" field2 "World"
...
HMSET myhashN field1 "Hello" field2 "World"

Как передать в скрипт несколько ключей хеша и несколько полей / значений?


ОБНОВЛЕНИЕ На основе комментария Итамара Хабера я понял, что моей проблемой была запятая с пробелом между значениями KEYS и ARGV -

Я закончил к следующему сценарию:

local k = 1 
for i=1,  #KEYS do
    if redis.call('hmset', KEYS[i], ARGV[k], ARGV[k+1], ARGV[k+2], ARGV[k+3]) == 1 then
        return 1
    end 
    k = k + 4 
end                                                                                                                                                                                             
return 0

redis-cli --eval /var/tmp/script.lua myhash1 myhash2 , field1 "Hello" field2 "World" field1 "Hello" field2 "World"

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

2 ответа

Решение

Чтобы свести к минимуму скачки, вы можете использовать конвейеризацию - проще и дает желаемый эффект.

Сценарий также может свести к минимуму прыжки. Использовать KEYS массив для передачи вам имен хеш-ключей в сценарий и ARGV массив для предоставления полей и значений.

Я нашел свой ответ в другом вопросе на Lua, как я могу использовать таблицу как varargs (...)?,

Так что я просто использую

redis.call('hmset', KEYS[i], table.unpack(ARGV) )

и это сработало для меня.

Другие вопросы по тегам