#redis #lua #phpredis
#redis #lua #phpredis
Вопрос:
Я хочу использовать скрипт lua для выполнения атомарной операции Redis с использованием расширения php / reids, поэтому мой код:
$command = "
local hashes = redis.call('smembers', ARGV[1])
for hash in pairs(hashes) do
local keys = redis.call('hkeys', hash)
for key in pairs(keys) do
redis.call('hset', key, 0)
end
end
return 1
";
$result = $this->redisClient->evaluate($command, [self::ALL_HASHES]);
этот скрипт должен брать все доступные хэши из self::ALL_HASHES
набора, перебирать каждый хэш и устанавливать значение для каждого хэш-ключа равным 0. Скрипт передается и $error = $this->redisClient->getLastError();
передается null
, но значения не равны 0. Что я делаю не так? Я новичок в Lua, это мой первый скрипт.
Ответ №1:
У вашего скрипта 2 проблемы. Прежде всего, вы должны использовать ipairs
для итерации массива вместо pairs
. pairs
выполняется итерация только ключевой части таблицы, и в этом случае она повторяет индекс массива. Во-вторых, ваша HSET
команда пропускает ключевую часть. Попробуйте следующий код:
local hashes = redis.call('smembers', ARGV[1])
for i, hash in ipairs(hashes) do
local keys = redis.call('hkeys', hash)
for j, key in ipairs(keys) do
redis.call('hset', hash, key, 0)
end
end
return 1
Комментарии:
1. хммм, позвольте мне попробовать, кстати, я пробовал
ipairs
, и у меня тоже есть какая-то проблема, может быть, это из-за того, что я пропустил ключевую часть2. @ItamarHaber Это мое удовольствие
![]()