Несколько 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) )
и это сработало для меня.