Как правильно реализовать очередь заданий используя Redis + PHP?
==================================================================

 Здравствуйте  
  

Необходимо реализовать очередь заданий. Эту очередь будут обрабатывать несколько серверов.  

Задания в redis будет храниться как строка из 400-1000 символов  
  

Но возникло несколько вопросов:  
**1. Как лучше хранить задания в redis?**  
**a.** в списке сразу хранить задания(эти 400-1000 символов)  
**b.** брать хэш(к примеру md5) заданий и сохранять в паре *ключ-значение*, где **ключ - это хэш, а значение - задание**. а в самом списке хранить хэши, т.е. для выполнения задания нам надо будет получить хэш, и по хэшу уже само задание.   
  
**2. Как реализовать приоритет**  

У меня только одна мысль. Сделать несколько очередей. В одну очередь помещаем задания с минимальным приоритетом, во вторую со средним, а в третью - с высоким.  
  
**2. Как обрабатывать эти задания?**  

Обработчиков должно быть несколько и они будут расположены на разных серверах.  

Одно задание должен обработать только один сервер.   

Обработчик должен быть на PHP  
  

Так вот я думаю сделать так  
  

```
// подключаемся к redis

while (true) {
  // проверяем или есть значение в очереди с ВЫСОКИМ приоритетом
  // проверяем или есть значение в очереди с СРЕДНИМ приоритетом 
  // проверяем или есть значение в очереди с НИЗКИМ приоритетом 

  // если нашли задание, то выполняем

  // если не нашли, то выполняем цикл.
}
```
  
  

Направьте меня на правильный путь. Спасибо 

> 2. Как реализовать приоритет

  

редис позволяет выбирать ключи по паттерну, соответственно в ключах и храните приоритет, типа 1\_somehash. В остальном логика вроде верная. 

 1. [php-redis-queue](https://packagist.org/packages/woojean/php-redis-queue)  

2. [jobs-in-php](https://medium.com/devcupboard/elegant-background-jobs-in-php-c61b91bf582b)  

И т.д. 

 Обычно очередь предполагает что консьюмер после обработки будет слать подтверждение. И только после этого данные удаляются из очереди. Причём, если один консьюмер забрал сообщение и его обрабатывает - второй не может его забрать, хотя оно её в очереди. В случае с redis - эту схему придётся реализовывать, как например а либе php-redis-queue, которую предложил выше [A N](http://toster.ru/user/AlekseyNikulin). Конечно можно на это забить, и сразу удалять сообщение, надеясь что консьюмер его точно обработает - в этом случае реализация простая. Ну или брать php-redis-queue. А так, конечно же использовать готовые решения для очередей.