2014-10-14 4 views
3

Я хотел бы реализовать параллельную очередь приоритетов в Redis, с несколькими процессами на разных машинах, добавляя элементы (с оценками) и несколькими другими процессами, которые выкладывают эти элементы, сначала с минимальным счетом.Параллельная очередь приоритетов в redis?

Простая очередь может быть реализована с помощью LPUSH и RPOP.

Используя ZSET, я могу добавить элементы, используя ZADD, и поместить их с ZRANGE и ZREM, если есть только один считыватель.

Для нескольких читателей, мне кажется, мне нужно что-то вроде ZPOP, которое сочетает ZRANGE и ZREM в одной атомной операции. В противном случае два считывателя могут получить один и тот же элемент от ZRANGE, прежде чем он сможет ZREM. Повторная попытка, если ZREM вернет 0, будет работать, но нежелательно.

Есть ли способ, которым я могу это сделать, используя текущие команды Redis? Есть ли причина, по которой это еще не было добавлено в Redis? Похоже, что это будет довольно простая команда для реализации.

ответ

4

Вы можете гарантировать атомарность, если используете сценарий Lua, который выполняет ZRANGE & ZREM или с блоком MULTI/EXEC. Это предотвратит вмешательство нескольких сотрудников друг в друга.

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

+0

Спасибо! Кажется, это решение ... –

1

вы можете использовать Redis команду: смотреть

WATCH zset 
element = ZRANGE zset 0 0 
MULTI 
ZREM zset element 
EXEC 

если Exec терпит неудачу (возвращает нулевой ответ), просто повторите эти команды.

Смежные вопросы