Ошибка попытка вызвать поле '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.