SCRIPT LOAD и EVALSHA
Загружайте скрипты с помощью SCRIPT LOAD и выполняйте их по SHA1 для повышения эффективности.
«SCRIPT LOAD и EVALSHA» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Проблема с EVAL
EVAL отправляет полный текст скрипта при каждом вызове. Для часто выполняемых скриптов это приводит к лишнему расходу пропускной способности. SCRIPT LOAD и EVALSHA решают проблему: скрипт загружается один раз, а затем вызывается по хешу SHA1.
SCRIPT LOAD
SCRIPT LOAD script компилирует скрипт, кэширует его в Redis и возвращает его хеш SHA1. Скрипт остаётся в кэше до перезапуска сервера или выполнения команды SCRIPT FLUSH.
# Redis CLI:
SCRIPT LOAD "return redis.call('GET', KEYS[1])"
# Returns: "abc123...sha1hash..."EVALSHA
EVALSHA sha1 numkeys [keys] [args] выполняет ранее загруженный скрипт, идентифицированный его SHA1. Команда завершается ошибкой NOSCRIPT, если скрипт отсутствует в кэше.
# Redis CLI:
EVALSHA abc123...sha1hash... 1 mykey
# Returns the same result as EVALШаблон использования в приложении
При запуске приложения: выполните SCRIPT LOAD для всех скриптов и сохраните их SHA1. Затем используйте EVALSHA для всех вызовов во время работы приложения.
local redis = require("redis")
local scriptText = [[
local v = redis.call("GET", KEYS[1])
return v
]]
local sha = redis:script_load(scriptText)
-- Later:
redis:evalsha(sha, 1, "mykey")Обработка ошибки NOSCRIPT
При перезапуске Redis кэшированные скрипты теряются. Перехватывайте ошибки NOSCRIPT и переходите к EVAL, чтобы загрузить скрипт повторно.
local function safeEvalsha(r, sha, script, numkeys, ...)
local ok, result = pcall(r.evalsha, r, sha, numkeys, ...)
if not ok and result:find("NOSCRIPT") then
sha = r:script_load(script)
result = r:evalsha(sha, numkeys, ...)
end
return result
endSCRIPT EXISTS
SCRIPT EXISTS sha1 [sha1 ...] проверяет, кэшированы ли скрипты. Для каждого кэшированного скрипта возвращается 1, для отсутствующего — 0. Используйте эту команду для предварительного прогрева кэша после перезапуска.
SCRIPT FLUSH
SCRIPT FLUSH удаляет все кэшированные скрипты из памяти Redis. Используйте команду при развёртывании, если скрипты изменились.
Версионирование скриптов
При изменении скрипта изменяется его SHA1. Храните SHA1 вместе с номерами версий и обновляйте их после развёртывания.
Экономия пропускной способности
Для скрипта размером 500 байт, вызываемого 10 000 раз в секунду, EVALSHA экономит 5 MB/s трафика Redis по сравнению с EVAL. При больших масштабах это существенно.
Кластер Redis с EVALSHA
В режиме кластера EVALSHA работает так же, как EVAL, с точки зрения ограничений слотов: все KEYS должны находиться в одном слоте.
Рекомендация
В рабочей среде всегда используйте EVALSHA после загрузки скриптов при запуске приложения. Реализуйте переход к EVAL при NOSCRIPT для устойчивости после перезапуска Redis.
Вопрос об EVALSHA
Что EVALSHA использует вместо текста скрипта?
Повторение: SCRIPT LOAD и EVALSHA
Один раз загружайте скрипты с помощью SCRIPT LOAD, чтобы получить SHA1. Для всех последующих вызовов используйте EVALSHA, чтобы экономить пропускную способность. Обрабатывайте ошибки NOSCRIPT повторной загрузкой. SCRIPT EXISTS проверяет состояние кэша, а SCRIPT FLUSH очищает его.
Часто задаваемые вопросы
Урок «SCRIPT LOAD и EVALSHA» бесплатный?
Да — полный текст урока «SCRIPT LOAD и EVALSHA» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «SCRIPT LOAD и EVALSHA»?
Загружайте скрипты с помощью SCRIPT LOAD и выполняйте их по SHA1 для повышения эффективности. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «SCRIPT LOAD и EVALSHA»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- EVAL и окружение Redis Lua
- Атомарные операции и транзакции
- Ограничение частоты запросов с Lua
- SCRIPT LOAD и EVALSHA