Spec-Zone.ru › Redis

LMOVE

LMOVE
Синтаксис
LMOVE source destination <LEFT | RIGHT> <LEFT | RIGHT>
Доступно с версии:
6.2.0
Сложность вычислений:
O(1)
Категории ACL:
@write, @list, @slow,

Атомарно возвращает и удаляет первый/последний элемент (голова/хвост в зависимости от аргумента wherefrom) списка, хранящегося по адресу source, и добавляет элемент в первый/последний элемент (голова/хвост в зависимости от аргумента whereto) списка, хранящегося по адресу destination.

Например: предположим, что source содержит список a,b,c, а destination содержит список x,y,z. Выполнение LMOVE source destination RIGHT LEFT приводит к тому, что source содержит a,b, а destination содержит c,x,y,z.

Если source не существует, возвращается значение nil и операция не выполняется. Если source и destination одинаковы, операция эквивалентна удалению первого/последнего элемента из списка и добавлению его в качестве первого/последнего элемента списка, поэтому её можно рассматривать как команду циклического сдвига списка (или как бесполезную операцию, если wherefrom равно whereto).

Эта команда заменяет устаревшую команду RPOPLPUSH. Выполнение LMOVE RIGHT LEFT эквивалентно.

Возврат

Ответ в виде строки: элемент, который был извлечён и добавлен.

Примеры

RPUSH mylist "one"
RPUSH mylist "two"
RPUSH mylist "three"
LMOVE mylist myotherlist RIGHT LEFT
LMOVE mylist myotherlist LEFT RIGHT
LRANGE mylist 0 -1
LRANGE myotherlist 0 -1

Шаблон: надёжная очередь

Redis часто используется как сервер сообщений для реализации обработки фоновых задач или других видов задач обмена сообщениями. Простой вид очереди часто получается путём добавления значений в список на стороне производителя и ожидания этих значений на стороне потребителя с использованием RPOP (используя опрос) или BRPOP, если для клиента предпочтительнее блокирующая операция.

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

LMOVE (или BLMOVE для блокирующей версии) предлагает способ избежать этой проблемы: потребитель извлекает сообщение и одновременно помещает его в список обработки. Он будет использовать команду LREM для удаления сообщения из списка обработки после обработки сообщения.

Дополнительный клиент может отслеживать список обработки на предмет элементов, которые остаются там слишком долго, и, при необходимости, добавлять эти истекшие по времени элементы обратно в очередь.

Шаблон: циклический список

Используя LMOVE с одинаковым ключом источника и назначения, клиент может посетить все элементы списка из N элементов по одному за раз в O(N) без передачи всего списка с сервера на клиент с использованием единственной операции LRANGE.

Вышеупомянутый шаблон работает даже в следующих условиях:

  • Несколько клиентов вращают список: они извлекут разные элементы, пока все элементы списка не будут посещены, и процесс начнется заново.
  • Даже если другие клиенты активно добавляют новые элементы в конец списка.

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

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

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

Spec-Zone.ru

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