Проектная лаборатория

Собственный Redis

0 / 124этапов пройдено

Этап 67 · Оптимистическая блокировка

WATCH внутри транзакции

Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.

На этом этапе вы реализуете MULTI и запретите вызов WATCH внутри транзакции.

Транзакции Redis

Ранее вы видели, как WATCH участвует в общей последовательности: начать следить за ключом, открыть транзакцию через MULTI, поставить команды в очередь и выполнить их через EXEC. Теперь начнём реализацию транзакций.

Транзакции Redis позволяют клиентам выполнять несколько команд как одну операцию. Основная последовательность:

  1. MULTI — перейти в режим транзакции: команды ставятся в очередь вместо немедленного выполнения.
  2. SET key value, INCR counter и другие — поставить команды в очередь.
  3. EXEC — выполнить все команды очереди.

EXEC появится позже. Сейчас вы реализуете MULTI и проверку в WATCH, не вызвана ли она внутри транзакции.

Команда MULTI

Команда MULTI начинает транзакцию.

$ redis-cli MULTI
OK

При вызове MULTI сервер:

  1. Помечает соединение как находящееся в транзакции.
  2. Возвращает OK простой строкой.

Обновлённая команда WATCH

WATCH должна вызываться до начала транзакции. Внутри транзакции она запрещена, поскольку транзакция уже началась и команды уже помещаются в очередь.

Теперь, когда состояние транзакции хранится, WATCH должна соблюдать это правило:

  • Если соединение вне транзакции:
    1. Добавить ключ в набор отслеживаемых ключей соединения.
    2. Вернуть OK простой строкой.
  • Если соединение внутри транзакции (после MULTI):
    1. Вернуть ошибку RESP вида -ERR WATCH inside MULTI is not allowed\r\n. Точная формулировка может отличаться, но должна содержать ERR, WATCH, inside MULTI и not allowed.

Например:

$ redis-cli
> WATCH counter
OK
> MULTI
OK
(TX)> WATCH another_key
(error) ERR WATCH inside MULTI is not allowed

Тесты

Тестирующая программа запустит вашу программу так:

$ ./your_program.sh

Затем создаст клиента, начнёт транзакцию через MULTI и отправит WATCH со случайным ключом:

$ redis-cli
> MULTI
OK
> WATCH key
(error) ERR WATCH inside MULTI is not allowed

Будет проверено, что:

  • MULTI возвращает OK простой строкой.
  • WATCH внутри транзакции возвращает ошибку RESP, содержащую ERR, WATCH, inside MULTI и not allowed.

Примечания

  • Понадобится хранить состояние отдельно для каждого соединения, например в отображении с ключом-соединением или сокетом.
  • При вызове WATCH вне транзакции сохраняйте отслеживаемые ключи, хотя они пока не используются. Это подготовка к следующим этапам.
  • Формат сообщения об ошибке может отличаться, если содержит обязательные ключевые слова.

Проверка в вашей IDE

Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.

Настройка проекта и IDE

1. Создайте проект один раз

node '/opt/graphlms/tools/project-lab/cli.mjs' init redis ./my-redis --language go

2. Откройте папку в IDE

cd ./my-redis

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage jq9

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста