0

I want to use lua script to make atomic Redis operation using php/reids extension, so my code is:

    $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]);

this script should take all availavle hashes from self::ALL_HASHES set, loop through each hash, and set value for each hash key to 0. Script is passing, and $error = $this->redisClient->getLastError(); is null, but values are not 0. What I'm doing wrong? I'm new to Lua, it's my first script.

Bogdan Dubyk
  • 4,756
  • 7
  • 30
  • 67

1 Answers1

2

You script has 2 problems. First of all, you should use ipairs to iterate the array, instead of pairs. pairs only iterates the key part of the table, and in this case, it iterates the array index. Second, your HSET command misses the key part. Try the following code:

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
for_stack
  • 21,012
  • 4
  • 35
  • 48