0Pricing
Lua Academy · Урок

Атомарные операции и транзакции

Используйте скрипты 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 — локальная установка не требуется.

Все уроки этого курса

  1. EVAL и окружение Redis Lua
  2. Атомарные операции и транзакции
  3. Ограничение частоты запросов с Lua
  4. SCRIPT LOAD и EVALSHA
← Назад к Lua Academy