Spec-Zone.ru › Redis

ОЖИДАТЬ

WAIT
Синтаксис
WAIT numreplicas timeout
Доступно с версии:
3.0.0
Сложность по времени:
O(1)
Категории ACL:
@slow, @connection,

Эта команда блокирует текущего клиента до тех пор, пока все предыдущие команды записи не будут успешно переданы и подтверждены как минимум указанным количеством реплик. Если истечёт указанный в миллисекундах таймаут, команда вернёт результат, даже если указанное количество реплик ещё не достигнуто.

Команда всегда вернёт количество реплик, которые подтвердили команды записи, отправленные текущим клиентом до команды WAIT, как в случае, когда указанное количество реплик достигнуто, так и в случае истечения таймаута.

Несколько замечаний:

  1. Когда WAIT возвращается, все предыдущие команды записи, отправленные в контексте текущего подключения, гарантированно получены указанным количеством реплик, возвращённым функцией WAIT.
  2. Если команда отправлена как часть транзакции MULTI (с Redis 7.0, любой контекст, не допускающий блокировки, например, внутри скриптов), команда не блокирует выполнение, а вместо этого возвращает как можно быстрее количество реплик, подтвердивших предыдущие команды записи.
  3. Таймаут 0 означает постоянную блокировку.
  4. Поскольку WAIT возвращает количество достигнутых реплик как при успехе, так и при неудаче, клиент должен проверить, что возвращённое значение равно или больше требуемого уровня репликации.

Согласованность и ОЖИДАТЬ

Обратите внимание, что WAIT не делает Redis надёжно согласованной базой данных: хотя синхронная репликация является частью реплицированной вычислительной машины, этого недостаточно. Однако в контексте переключения Sentinel или Redis Cluster WAIT улучшает безопасность данных в реальном мире.

Если определённая запись передана одной или нескольким репликам, то (но не гарантировано) при отказе мастера с большей вероятностью во время переключения удастся повысить реплику, получившую запись: Sentinel и Redis Cluster предпримут все возможные усилия, чтобы выбрать лучшую реплику из доступных.

Однако это только попытка, и возможна ситуация, когда запись, синхронно реплицированная на несколько реплик, всё же будет потеряна.

Детали реализации

С момента внедрения частичной ресинхронизации с репликами (функция PSYNC) реплики асинхронно посылают своему мастеру оффсет, который они уже обработали в потоке репликации. Это используется в нескольких случаях:

  1. Обнаружение реплик, вышедших из строя из-за таймаута.
  2. Выполнение частичной ресинхронизации после отключения.
  3. Реализация 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API