ОЖИДАТЬ
WAIT
WAIT numreplicas timeout
- Доступно с версии:
- 3.0.0
- Сложность по времени:
- O(1)
- Категории ACL:
-
@slow,@connection,
Эта команда блокирует текущего клиента до тех пор, пока все предыдущие команды записи не будут успешно переданы и подтверждены как минимум указанным количеством реплик. Если истечёт указанный в миллисекундах таймаут, команда вернёт результат, даже если указанное количество реплик ещё не достигнуто.
Команда всегда вернёт количество реплик, которые подтвердили команды записи, отправленные текущим клиентом до команды WAIT, как в случае, когда указанное количество реплик достигнуто, так и в случае истечения таймаута.
Несколько замечаний:
- Когда
WAITвозвращается, все предыдущие команды записи, отправленные в контексте текущего подключения, гарантированно получены указанным количеством реплик, возвращённым функциейWAIT. - Если команда отправлена как часть транзакции
MULTI(с Redis 7.0, любой контекст, не допускающий блокировки, например, внутри скриптов), команда не блокирует выполнение, а вместо этого возвращает как можно быстрее количество реплик, подтвердивших предыдущие команды записи. - Таймаут 0 означает постоянную блокировку.
- Поскольку
WAITвозвращает количество достигнутых реплик как при успехе, так и при неудаче, клиент должен проверить, что возвращённое значение равно или больше требуемого уровня репликации.
Согласованность и ОЖИДАТЬ
Обратите внимание, что WAIT не делает Redis надёжно согласованной базой данных: хотя синхронная репликация является частью реплицированной вычислительной машины, этого недостаточно. Однако в контексте переключения Sentinel или Redis Cluster WAIT улучшает безопасность данных в реальном мире.
Если определённая запись передана одной или нескольким репликам, то (но не гарантировано) при отказе мастера с большей вероятностью во время переключения удастся повысить реплику, получившую запись: Sentinel и Redis Cluster предпримут все возможные усилия, чтобы выбрать лучшую реплику из доступных.
Однако это только попытка, и возможна ситуация, когда запись, синхронно реплицированная на несколько реплик, всё же будет потеряна.
Детали реализации
С момента внедрения частичной ресинхронизации с репликами (функция PSYNC) реплики асинхронно посылают своему мастеру оффсет, который они уже обработали в потоке репликации. Это используется в нескольких случаях:
- Обнаружение реплик, вышедших из строя из-за таймаута.
- Выполнение частичной ресинхронизации после отключения.
- Реализация
WAIT.
В случае реализации WAIT, Redis запоминает для каждого клиента оффсет репликации произведённого потока репликации, когда команда записи была выполнена в контексте данного клиента. При вызове WAIT Redis проверяет, подтвердили ли указанное количество реплик этот оффсет или больший.
Возврат
Целое число: Команда возвращает количество реплик, достигнутых всеми операциями записи, выполненными в контексте текущего подключения.
Примеры
> SET foo bar OK > WAIT 1 0 (integer) 1 > WAIT 2 1000 (integer) 1
В следующем примере первый вызов WAIT не использует таймаут и требует достижения записи 1 репликой. Он завершается успешно. Во втором случае мы устанавливаем таймаут и требуем репликации записи на две реплики. Поскольку доступна только одна реплика, через секунду WAIT разблокируется и вернёт 1 — количество достигнутых реплик.
© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/wait/