Выполнение 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…]) |
Позволяет использовать произвольную команду. Отличие от |
error_reply(x) |
Вспомогательная функция для формирования текста ошибки |
status_reply(x) |
Служит для формирования ответа пользователю в формате simple string |
sha1hex(x) |
Возвращает SHA-1 от переданной строки |
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-скрипт выполнен.