Выполнение Lua-скриптов#

Последовательность выполнения#

Для выполнения Lua-скриптов используются команды EVAL и EVALSHA.

Перед использованием команды EVALSHA необходимо предварительно загрузить скрипт на сервер с помощью команды SCRIPT LOAD, в ответ будет получена SHA-1 хеш-сумма скрипта. Во время исполнения команды EVALSHA поиск скрипта для выполнения осуществляется по SHA-1 хеш-сумме.

Для команды EVALSHA доступны два предзагруженных скрипта, ретранслированных и скомпилированных на языке Golang (без исполнения Lua-кода): rate_limit, rate_limit_percent.

Скрипты, переданные командой EVAL, кешируются на сервере и хранятся совместно со скриптами, загруженными командой SCRIPT LOAD. Рост числа загруженных и закешированных скриптов ведет к повышению потребления памяти. Для удаления скриптов используйте команду SCRIPT FLUSH.

Чтобы проверить наличие загруженного скрипта по его SHA-1 хеш-сумме, используйте команду SCRIPT EXISTS.

Ограничение выполнения Lua-скриптов#

Скрипты должны быть написаны на языке Lua версии 5.1 с ограниченным набором стандартных библиотек: table, math, string, debug и os (только метод clock).

Запрещено объявление глобальных переменных и функций.

Реализована поддержка сторонних библиотек:

  • struct — библиотека для упаковки/распаковки C-структур;

  • cjson — работа с JSON;

  • bitop — битовые операции над числами.

Для параметризации скрипта можно использовать глобальные переменные KEYS и ARGV, которые представляют собой массив строк, переданных в командах EVAL или EVALSHA.

Для взаимодействия с данными необходимо использовать объект redis, имеющий следующий набор методов:

Метод

Описание

call(command [,arg…])

Позволяет использовать произвольную команду. Ошибка в момент исполнения приведет к возврату ошибки пользователю

pcall(command [,arg…])

Позволяет использовать произвольную команду. Отличие от call в том, что можно в скрипте обработать ошибку

error_reply(x)

Вспомогательная функция для формирования текста ошибки

status_reply(x)

Служит для формирования ответа пользователю в формате simple string

sha1hex(x)

Возвращает SHA-1 от переданной строки x

log(level, message)

Формирует запись в серверный лог. Поддерживаемые уровни логирования: redis.LOG_DEBUG, redis.LOG_VERBOSE, redis.LOG_NOTICE, redis.LOG_WARNING. Запись в лог осуществляется в соответствии с настроенным уровнем логирования сервера

setresp(x)

Позволяет установить версию протокола RESP. Поддерживается только протокол RESP3, поэтому вызов данного метода не приведет к изменениям

set_repl(x)

Управление репликацией результатов исполнения последующих команд, используя следующие константы: redis.REPL_ALL, redis.REPL_AOF, redis.REPL_REPLICA, redis.REPL_SLAVE (равно REPL_REPLICA, поддержка для обратной совместимости), redis.REPL_NONE. REPL_NONE отключает репликацию, все остальные включают репликацию

REDIS_VERSION

Возвращает версию ПО в формате major.minor.patch (MM.mm.pp)

REDIS_VERSION_NUM

Возвращает версию ПО в шестнадцатиричном виде (0x00MMmmpp), переведенную в десятиричный вид

Результат#

Lua-скрипт выполнен.