PHP Redis Lua с проблемой сценария - PullRequest
0 голосов
/ 11 апреля 2019

Я хочу использовать скрипт 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 голосов
/ 11 апреля 2019

Ваш скрипт имеет 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
...