Как реализовать условный поп-ориентированный на параллелизм в Redis? - PullRequest
2 голосов
/ 25 августа 2011

Я строю что-то вроде линии задержки: один процесс RPUSHes объекты в список, другой LPOP их в том же порядке.

Хитрость в том, что объекты должны быть извлечены из списка только через час после их добавления. Я мог бы использовать отметку времени для этого. Задержка одинакова для всех предметов и никогда не меняется.

Теперь, как мне реализовать pop в дружественном для параллелизма способе (чтобы он все еще работал, когда несколько рабочих получают доступ к этому списку)? Я мог бы достать предмет, проверить временную метку и вернуть ее в список, если еще слишком рано. Но если несколько рабочих делают это одновременно, это может испортить порядок вещей. Я мог бы проверить первый пункт и выскочить, только если он должен. Но другой работник мог бы вытащить его тогда, поэтому я вставил не тот.

Должен ли я использовать команду WATCH? Как? Должен ли я использовать отсортированные наборы вместо списка? Помощь оценена!

Ответы [ 2 ]

6 голосов
/ 25 августа 2011

Я бы предложил использовать отсортированный набор. Записи идут в zset с нормальным идентификатором в качестве ключа и отметкой времени в стиле Unix в качестве оценки. Сделайте метки времени дата + время, после которого каждая запись готова для анализа. Рабочие делают ZPOP, который не является встроенным, но может эмулироваться с помощью:

MULTI
ZRANGE <key> 0 0 WITHSCORES
ZREMRANGEBYRANK <key> 0 0
EXEC

Захват результатов ZRANGE, и у вас есть элемент с самым низким показателем в то время, уже удаленный из набора, с его счетом. Положите его обратно, если он еще не действителен с ZADD <key> <score> <item>.

1 голос
/ 25 августа 2011

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

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

Существует несколько способов реализации базового планирования с использованием нескольких списков:

  • Добавьте задачи в отсортированный набор, и один работник отвечает за их перемещение из отсортированного набора в список, к которому у нескольких рабочих есть доступ с помощью pop.
  • Составьте список для каждой минуты, и пусть рабочие прочитают прошлые списки. Вы можете минимизировать количество проверенных списков, используя другой ключ, который отслеживает самую старую непустую очередь.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...