Spec-Zone.ru › Redis

КЛИЕНТ

CLIENT UNBLOCK
Синтаксис
CLIENT UNBLOCK client-id [TIMEOUT | ERROR]
Доступно с версии:
5.0.0
Временная сложность:
O(log N), где N — количество подключений к клиенту
Категории ACL:
@admin, @slow, @dangerous, @connection,

Эта команда может разблокировать клиента, заблокированного в операции блокировки, например, с другого подключения BRPOP или XREAD или WAIT.

По умолчанию клиент разблокируется как будто истекло время ожидания команды, однако, если передать дополнительный (и необязательный) аргумент, можно указать поведение разблокировки, которое может быть TIMEOUT (по умолчанию) или ERROR. Если указано ERROR, клиент разблокируется, и возвращается ошибка, что клиент был принудительно разблокирован. В частности, клиенту будет возвращена следующая ошибка:

-UNBLOCKED client unblocked via CLIENT UNBLOCK

Примечание: конечно, как обычно, нет гарантии, что текст ошибки останется неизменным, однако код ошибки останется -UNBLOCKED.

Эта команда особенно полезна, когда мы отслеживаем множество ключей с ограниченным количеством подключений. Например, мы можем отслеживать несколько потоков с помощью XREAD, не используя более N подключений. Однако в какой-то момент процесс потребителя получает уведомление о том, что для отслеживания есть ещё один ключ потока. Чтобы избежать использования дополнительных подключений, лучшим вариантом будет остановить команду блокировки одного из подключений в пуле, добавить новый ключ и снова выполнить команду блокировки.

Для достижения этого используется следующая схема. Процесс использует дополнительное управляющее подключение для отправки команды CLIENT UNBLOCK при необходимости. Тем временем, прежде чем запускать операцию блокировки на других подключениях, процесс выполняет CLIENT ID, чтобы получить ID, связанный с этим подключением. Когда нужно добавить новый ключ или прекратить мониторинг ключа, соответствующая команда блокировки подключения прерывается путём отправки CLIENT UNBLOCK в управляющем подключении. Команда блокировки вернётся и может быть снова выполнена.

Этот пример демонстрирует применение в контексте потоков Redis, но этот метод является общим и может быть применён к другим случаям.

Примеры

Connection A (blocking connection):
> CLIENT ID
2934
> BRPOP key1 key2 key3 0
(client is blocked)

... Now we want to add a new key ...

Connection B (control connection):
> CLIENT UNBLOCK 2934
1

Connection A (blocking connection):
... BRPOP reply with timeout ...
NULL
> BRPOP key1 key2 key3 key4 0
(client is blocked again)

Возврат

Целочисленный ответ, а именно:

  • 1 если клиент был успешно разблокирован.
  • 0 если клиент не был разблокирован.

© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/client-unblock/

Spec-Zone.ru

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