Redis
 sql >> Base de données >  >> NoSQL >> Redis

Annuler des emplois à Laravel

Il n'y a pas de moyen direct ou facile de le faire. Les travaux retardés sont conservés dans des sorted sets comme temps à traiter comme score et la charge utile du travail comme value .

Il existe plusieurs façons de supprimer un élément des ensembles triés (la plupart d'entre elles nécessitent des efforts en fonction de la taille de la file d'attente retardée) telles que

  • Vous obtenez la charge utile "exacte" de la tâche envoyée, puis utilisez ZREM pour la supprimer. C'est difficile car l'objet (version sérialisée du travail avec tous les paramètres) peut être énorme et vous ne pouvez pas créer le travail "exact" car il a un identifiant unique. Vous pouvez en obtenir la liste avec ZRANGEBYSCORE et avec WITHSCORES . Il vous donnera la liste des emplois avec leurs scores. Vous pouvez utiliser le score pour identifier le travail retardé. Obtenez la valeur (charge utile sérialisée) puis utilisez ZREM .
  • S'il n'y a qu'un seul travail à traiter à un moment précis, vous pouvez utiliser ZREMRANGEBYSCORE en utilisant le temps de traitement. S'il y a n tâches à traiter exactement à ce moment-là, d'autres tâches peuvent également être supprimées depuis ZREMRANGEBYSCORE prend un intervalle de temps.
  • Vous pouvez essayer d'utiliser ZSCAN pour analyser toute la liste différée (avec pagination) et trouver le score et l'identifiant du travail, puis utiliser ZREMRANGEBYLEX avec l'identifiant pour le supprimer.
  • Une autre façon pourrait être de mettre une condition d'annulation au début de handle méthode. Celui-ci nécessite le développement de la couche application. Chaque fois que vous poussez un travail dans la file d'attente, vous envoyez un identifiant au travail, mettez également le même identifiant (que vous pouvez comprendre) dans Redis (avec EXPIRE supérieur au temps de retard). Lorsque vous souhaitez l'annuler, supprimez-le de Redis. À l'intérieur de la méthode handle, vérifiez si l'identifiant donné existe dans Redis, s'il n'est pas renvoyé plus tôt du bloc de code.