Проектная лаборатория
Собственный Redis
Этап 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 go2. Откройте папку в IDE
cd ./my-redisРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage hq1Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.