Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Cancelar trabalhos em Laravel


Não existe uma maneira direta ou fácil de fazer isso. Os trabalhos atrasados ​​são mantidos em sorted sets como tempo a ser processado como score e carga útil do trabalho como o value .

Existem várias maneiras de remover um elemento dos conjuntos ordenados (a maioria deles requer alguns esforços dependendo do tamanho da fila atrasada), como
  • Você obtém a carga útil "exata" do trabalho despachado e usa o ZREM para removê-lo. É difícil porque o objeto (versão serializada do trabalho com todos os parâmetros) pode ser enorme e você não pode criar o trabalho "exato" porque possui um identificador exclusivo. Você pode obter a lista com ZRANGEBYSCORE e com WITHSCORES . Ele lhe dará a lista de trabalhos com suas pontuações. Você pode usar a pontuação para identificar o trabalho atrasado. Obtenha o valor (carga útil serializada) e use ZREM .
  • Se houver apenas um trabalho a ser processado em um horário específico, você poderá usar ZREMRANGEBYSCORE com o uso do tempo processado. Se houver n trabalhos a serem processados ​​exatamente nesse momento, outros trabalhos também poderão ser excluídos desde ZREMRANGEBYSCORE leva intervalo de tempo.
  • Você pode tentar usar o ZSCAN para escanear toda a lista atrasada (com paginação) e encontrar a pontuação e o identificador do trabalho e, em seguida, usar o ZREMRANGEBYLEX com o identificador para removê-lo.
  • Outra maneira poderia ser colocar uma condição de cancelamento no início de handle método. Este requer o desenvolvimento da camada de aplicação. Sempre que você envia um trabalho para a fila, você envia um identificador para o trabalho, coloque o mesmo identificador (que você possa entender) no Redis também (com EXPIRE maior do que o tempo de atraso). Quando você quiser cancelá-lo, exclua-o do Redis. Dentro do método handle, verifique se o identificador fornecido existe no Redis, se não retornar antecipadamente do bloco de código.