попытка вызвать поле 'replicate_commands' (нулевое значение) - PullRequest
1 голос
/ 19 января 2020

Я использую jedis + lua для проверки сценария, вот мой lua сценарий:


    redis.replicate_commands()
    local second = redis.call('TIME')[1]
    local currentKey = KEYS[1]..second
    if redis.call('EXISTS', currentKey) == 0 then
        redis.call('SETEX', currentKey, 1, 1)
        return 1
    else
        return redis.call('INCR', currentKey)
    end

Поскольку я использую «Время», он сообщает об ошибке: Запись команд не разрешена после недетерминированные c команды . после поиска по inte rnet я добавляю 'redis.replicate_commands ()' в качестве первой строки сценария lua, но он по-прежнему сообщает об ошибке: ERR Ошибка запуска сценария (вызов f_c89a6ee8ad732a325e530f4a69226851cde302e2): @user_script: 1: user_script: 1: попытка вызвать поле 'replicate_commands' (значение nil)

Нужны ли replicate_commands аргументы или есть способ решить мою проблему?

версия redis: 3.0

версия для джедаев: 2.9

lua версия: я не знаю, где найти

1 Ответ

0 голосов
/ 20 января 2020

Ошибка попытка вызвать поле 'replicate_commands' (значение nil) означает, что replicate_commands() не существует в объекте redis. Это сообщение об ошибке Lua.

replicate_commands() было введено до Redis 3.2. См. EVAL - репликация команд вместо сценариев . Рассмотрите возможность обновления.

Первое сообщение об ошибке ( Команды записи не разрешены после недетерминированных c команд ) - это сообщение на стороне redis, вы не можете вызывать команды записи (такие как SET, SETEX , INCR и т. Д. c) после вызова недетерминированных команд c (например, SPOP, SCAN, RANDOMKEY, TIME и т. Д. c).

Очень важной частью сценариев является написание сценариев, которые являются чистыми функциями. Сценарии, выполняемые в экземпляре Redis, по умолчанию распространяются на реплики и в файл AOF путем отправки самого сценария, а не полученных команд.

Это так, если сервер Redis перезапускается, при повторном воспроизведении журнала AOF или при репликации в ведомое устройство сценарий должен доставить тот же набор данных.

Именно поэтому в Redis 3.2 replicate_commands() был представлен. А начиная с Redis 5 сценарии всегда реплицируются как эффекты - как если бы replicate_commands() вызывался при запуске сценария. Но для версий до 3.2 вы просто не можете сделать это.

Поэтому либо обновите систему до 3.2 или новее, либо вместо этого передайте currentKey, уже рассчитанный для сценария от клиента.

Обратите внимание, что Создание currentKey динамически делает ваш скрипт только для одного экземпляра.

Все команды Redis должны быть проанализированы перед выполнением, чтобы определить, над какими клавишами будет работать команда. Чтобы это было верно для EVAL, ключи должны быть переданы явно. Это полезно во многих отношениях, но особенно для того, чтобы убедиться, что Redis Cluster может переслать ваш запрос на соответствующий узел кластера.

Обратите внимание, что это правило не применяется, чтобы предоставить пользователю возможность использовать один экземпляр Redis. конфигурации, за счет написания сценариев, несовместимых с Redis Cluster.

Наконец, версия Lua в Redis 3.0.0 равна Lua 5.1.5 , то же самое как до Redis 6 RC1.

...