Проблема со скриптом PHP Redis Lua

#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 Это мое удовольствие 🙂