Redis предоставляет богатый набор инструкций, но все же не может соответствовать всем сценариям.В некоторых конкретных сценариях необходимо настроить некоторые спецификации для выполнения определенных функций. Поэтому Redis обеспечивает поддержку сценариев Lua, и пользователи могут писать свои собственные сценарии для достижения желаемых функций.
Что такое Луа?
Lua — это мощный, эффективный, легкий, встраиваемый язык сценариев. Это язык с динамической типизацией, который работает путем интерпретации байт-кода с использованием виртуальной машины на основе регистров и имеет автоматическое управление памятью с добавочной сборкой мусора, что делает его лучшим выбором для настройки, сценариев и быстрого прототипирования.
Как Redis выполняет сценарии Lua
ОЦЕНКА команда
Redis может использовать команду EVAL для выполнения соответствующего сценария Lua.
> EVAL 'local val="Hello Jackey" return val' 0
"Hello Jackey"
Вы можете выполнять Lua-скрипты в интерактивном режиме, подобно этому, что упрощает обработку ошибок. Просто этого недостаточно, иногда нам нужно передать какие-то параметры Lua-скрипту. Внимательные студенты наверняка заметили, что после скрипта стоит цифра 0, что означает, что параметры не передаются.
Как передать параметры?
> EVAL 'local val=KEYS[1] return val.." "..ARGV[1]' 1 Hello Redis
"Hello Redis"
Фактически, очень простые, параметры передаются в виде KV, эта цифра представляет количество прошедших параметров ключевых параметров, а затем задняя часть - это ключ N и N-значение. В скрипте следует понимать, что получить соответствующее значение из массива и клавиш ARGV Arry, индекс 1 от начала.
Две точки в приведенном выше примере — это операторы конкатенации строк в сценариях Lua.
Теперь мы знаем, как выполнять Lua-скрипты в Redis, но такие скрипты не имеют ничего общего с Redis, как мы можем манипулировать данными в Redis? Пожалуйста, продолжайте смотреть мое выступление
> get my_name
"Jackeyzhe"
> EVAL 'local val=ARGV[1].." "..redis.call("get",KEYS[1]) return val' 1 my_name Hello
"Hello Jackeyzhe"
Используйте redis.call или redis.pcall (упоминается позже) для работы с redis.
Следует отметить, что если возвращается следующая ошибка, это означает, что ключ, который необходимо получить, не существует.
> EVAL 'local val=ARGV[1].." "..redis.call("get",KEYS[1]) return val' 1 me Hello
(error) ERR Error running script (call to f_eb11f8ddeeee07cc88d1f3bd103069284b83c5d8): @user_script:1: user_script:1: attempt to concatenate a boolean value
Мы можем использовать описанный выше метод для выполнения некоторых простых сценариев Lua.Если мы хотим выполнить более сложные сценарии Lua, команда EVAL будет раздутой и запутанной. Итак, Redis предоставляет другой метод.
redis-cli --eval
Мы можем сначала написать файл Lua, а затем выполнить его с помощью команды redis-cli.
local name=redis.call("get", KEYS[1])
local greet=ARGV[1]
local result=greet.." "..name
return result
> redis-cli --eval hello.lua my_name , Hello
"Hello Jackey"
Таким образом, мы можем сначала написать файл .lua. Разлученный ключ и ARGV.
EVALSHA
Вы думали, что это закончилось? Тогда слишком наивен. Что, если мы находимся в интерактивном режиме Redis и хотим выполнить файл сценария? Выходить каждый раз и снова подключаться после выполнения? Это слишком большая проблема. Redis предоставляет команду EVALSHA, которая позволяет нам выполнять файлы сценариев в интерактивном режиме.
Во-первых, вам нужно загрузить файл скрипта
$ redis-cli SCRIPT LOAD "$(cat hello.lua)"
"463ff2ca9e78e36cd66ee9d37ee0dcd59100bf46"
Вы получите строку шестнадцатеричных чисел, которая однозначно идентифицирует этот сценарий. После получения этого числа, это означает, что мы загрузили скрипт на сервер, и тогда мы можем использовать этот идентификатор для выполнения скрипта.
> EVALSHA 463ff2ca9e78e36cd66ee9d37ee0dcd59100bf46 1 my_name Hello
"Hello Jackeyzhe"
убить скрипт
Время выполнения скриптов Lua в Redis по умолчанию составляет 5 секунд. Обычно время выполнения скриптов указывается в миллисекундах. Если время выполнения истекло, скрипт не остановится, но будет записан журнал ошибок.
Есть два способа завершить выполнение скрипта
- Используйте команду Script Script
- Выключите сервер с помощью команды SHUTDOWN NOSAVE.
Однако не рекомендуется вручную завершать работу скрипта.
Суммировать
В этой статье кратко рассказывается, что такое Lua и как Redis выполняет и завершает сценарии Lua. Если вы его освоили, то поздравляем вас с окончанием начальной школы Lua. В средней школе Lua вы более подробно узнаете Redis о командах Lua.