Атомарные операции и транзакции
Используйте скрипты Lua для выполнения многошаговых атомарных операций Redis.
«Атомарные операции и транзакции» — бесплатный урок Lua Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Зачем нужны атомарные многошаговые операции?
Во многих сценариях использования Redis требуется читать и записывать несколько ключей в рамках одной согласованной операции. Без атомарности состояния повреждаются из-за состояний гонки.
Состояние гонки при чтении, изменении и записи
Без Lua: GET счётчика → изменить на клиенте → SET счётчика. Два клиента могут прочитать одно и то же значение, изменить его, а вторая команда SET перезапишет изменения первой.
Исправление с помощью скрипта Lua
С Lua в Redis чтение, изменение и запись выполняются атомарно внутри сервера.
EVAL "
local val = redis.call('GET', KEYS[1])
val = tonumber(val) or 0
val = val + tonumber(ARGV[1])
redis.call('SET', KEYS[1], val)
return val
" 1 counter 5Сравнение и обмен
Реализуйте CAS (сравнение и обмен) атомарно — обновляйте значение только в том случае, если текущее значение совпадает с ожидаемым.
EVAL "
local cur = redis.call('GET', KEYS[1])
if cur == ARGV[1] then
redis.call('SET', KEYS[1], ARGV[2])
return 1
end
return 0
" 1 mykey expected newvalueРаспределённая блокировка
Атомарно захватывайте блокировку: SET key value NX EX seconds. Это безопасный шаблон — эквивалентная реализация на Lua.
EVAL "
if redis.call('SET', KEYS[1], ARGV[1], 'NX', 'EX', ARGV[2]) then
return 1
end
return 0
" 1 lock:resource "owner-uuid" 30Безопасное снятие блокировки
Снимайте блокировку только в том случае, если Вы являетесь её владельцем. Это не позволяет другому клиенту снять чужую блокировку.
EVAL "
if redis.call('GET', KEYS[1]) == ARGV[1] then
return redis.call('DEL', KEYS[1])
end
return 0
" 1 lock:resource "owner-uuid"Транзакции с несколькими ключами
Скрипты Lua могут атомарно работать с несколькими ключами — этого нельзя гарантировать с помощью MULTI/EXEC, поскольку выполнение может завершиться посередине, оставив частично изменённое состояние.
MULTI/EXEC и Lua
MULTI/EXEC ставит команды в очередь для пакетного выполнения, но не обеспечивает настоящую атомарность чтения значений (наблюдение и отмена наблюдения усложняют решение). Скрипты Lua проще и полностью атомарны.
Откат в Lua
Lua в Redis не поддерживает транзакции с откатом. Если в середине выполнения возникает ошибка, ранее выполненные команды redis.call не отменяются. Проектируйте скрипты безопасно: сначала проверяйте предусловия.
Ограничения на размер скриптов
Скрипты должны быть небольшими и быстрыми. Сложную логику следует размещать на уровне приложения, а не в Redis. Используйте Lua только для атомарной части операции.
Тестирование атомарности
Тестируйте состояния гонки с помощью параллельных клиентов Redis. Проверяйте, что скрипт Lua сохраняет корректное состояние при высокой конкуренции, используя инструменты тестирования производительности Redis.
Вопрос об атомарных операциях
Почему чтение, изменение и запись в скрипте Lua для Redis безопаснее, чем выполнение этой операции в коде приложения?
Повторение: атомарные операции и транзакции
Используйте скрипты Lua в Redis для атомарного чтения, изменения и записи, CAS и распределённых блокировок. Для операций, зависящих от прочитанных значений, скрипты Lua проще и надёжнее, чем MULTI/EXEC. Делайте скрипты небольшими и тестируйте их при параллельном выполнении.
Часто задаваемые вопросы
Урок «Атомарные операции и транзакции» бесплатный?
Да — полный текст урока «Атомарные операции и транзакции» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Атомарные операции и транзакции»?
Используйте скрипты Lua для выполнения многошаговых атомарных операций Redis. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Атомарные операции и транзакции»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- EVAL и окружение Redis Lua
- Атомарные операции и транзакции
- Ограничение частоты запросов с Lua
- SCRIPT LOAD и EVALSHA