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

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

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

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

Снятие наблюдения при DISCARD

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

На этом этапе вы реализуете DISCARD и проверите, что она очищает отслеживаемые ключи.

Команда DISCARD

Команда DISCARD отменяет транзакцию. Она удаляет все команды очереди и выходит из режима транзакции:

$ redis-cli
> MULTI
OK
> SET foo 100
QUEUED
> SET bar 200
QUEUED
> DISCARD
OK

Ответ всегда равен +OK\r\n.

Очистка состояния наблюдения

Как и EXEC, команда DISCARD очищает отслеживаемые ключи соединения. Поэтому изменения, произошедшие до DISCARD, не влияют на следующую транзакцию того же соединения.

$ redis-cli
# Client A
> WATCH foo
OK
 
# Client B
> SET foo 999
OK
 
# Client A
> MULTI
OK
> SET bar 200
QUEUED
> DISCARD
OK                     # watch state cleared
 
# Client A starts a new transaction (no WATCH active)
> MULTI
OK
> SET bar 200
QUEUED
> EXEC
1) OK                  # succeeds, DISCARD cleared the watch state

Без очистки вторая транзакция ошибочно завершилась бы неудачей из-за изменения foo до DISCARD.

Тесты

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

$ ./your_program.sh

Тест создаст двух клиентов. Первый задаст два ключа, начнёт их отслеживать и откроет транзакцию:

# Client 1
> SET foo 100
OK
> SET bar 200
OK
> WATCH foo bar
OK
> MULTI
OK
> SET bar 300
QUEUED

Второй изменит один из отслеживаемых ключей:

# Client 2
> SET foo 400
OK

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

# Client 1
> DISCARD
OK
 
# Client 1 starts a new transaction
> MULTI
OK
> SET bar 300
QUEUED
> EXEC
1) OK                  # succeeds, DISCARD cleared the watch state
 
# Client 2
> GET bar
"300"                  # confirms the second transaction's write took effect

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

  • DISCARD возвращает +OK\r\n.
  • DISCARD очищает состояние наблюдения соединения.
  • Вторая транзакция успешна, поскольку DISCARD очистила отслеживаемые ключи.
  • Команды второй транзакции применены.

Примечания

  • DISCARD должна очистить и очередь команд, и состояние наблюдения: отслеживаемые ключи и флаг dirty.
  • Если очистка состояния наблюдения уже реализована в EXEC, для DISCARD используйте тот же подход.

Проверка в вашей 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 hq1

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

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

go / ЛОКАЛЬНО

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

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

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

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