Скрипт Lua в Redis Cluster

У меня есть кластер Redis, и я хотел бы выполнить сценарий LUA на целевом узле. Когда я это делаю, я получаю сообщение об ошибке от Redis Cluster, в котором говорится, что ключи должны находиться в одном и том же SLOT, но скрипт выполняет две команды только для 1 ключа.

if redis.call('HEXISTS', 'TEST', KEYS[1]) == 1
    then 
        redis.call('HSET', 'TEST', KEYS[1], ARGV[1])
        return 1
    end
return 0

Я попытался использовать ключ хеш-тега, но он не работает.


person Davide Cerbo    schedule 17.01.2019    source источник


Ответы (1)


Вы получаете эту ошибку, потому что пытаетесь получить доступ к ключу Redis с именем TEST, но не сообщайте об этом Redis или вашему клиенту Redis, указав его в команде EVAL.

Сценарии Redis Lua принимают два списка аргументов, один - общего назначения (ARGV[]), а другой - строгий список ключей, к которым сценарий собирается получить доступ (KEYS[]).

Возможно, вы поменяли местами имя ключа и имена полей в вызове HEXISTS, т.е. вам может потребоваться использовать:

if redis.call('HEXISTS', KEYS[1], 'TEST') == 1
    then 
        redis.call('HSET', KEYS[1], 'TEST', ARGV[1])
        return 1
    end
return 0

Это должно работать, пока имя ключа правильно передается команде EVAL.

person yossi    schedule 17.01.2019
comment
Благодарность! решение было у меня под носом, но я не вижу :) Скрипт ниже теперь работает: если redis.call ('HEXISTS', KEYS [1], ARGV [1]) == 1, то redis.call ('HSET ', KEYS [1], ARGV [1], ARGV [2]) вернуть 1 конец вернуть 0 - person Davide Cerbo; 18.01.2019