Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Jobs in Laravel kündigen

Es gibt keinen direkten oder einfachen Weg, dies zu tun. Die verzögerten Jobs werden in sorted sets aufbewahrt als zu verarbeitende Zeit als score und Auftragsnutzdaten als value .

Es gibt mehrere Möglichkeiten, ein Element aus den sortierten Mengen zu entfernen (die meisten erfordern je nach Größe der verzögerten Warteschlange einige Anstrengungen), z. B.

  • Sie erhalten die "genaue" Nutzlast des gesendeten Jobs und verwenden dann ZREM, um sie zu entfernen. Es ist schwierig, weil das Objekt (serialisierte Version des Auftrags mit allen Parametern) sehr groß sein kann und Sie den "genauen" Auftrag nicht erstellen können, da er eine eindeutige Kennung hat. Sie können die Liste davon mit ZRANGEBYSCORE und mit WITHSCORES erhalten . Es wird Ihnen die Liste der Jobs mit ihren Punktzahlen geben. Sie können den Score verwenden, um einen verzögerten Job zu identifizieren. Holen Sie sich den Wert (serialisierte Nutzlast) und verwenden Sie dann ZREM .
  • Wenn zu einem bestimmten Zeitpunkt nur ein Auftrag verarbeitet werden soll, können Sie ZREMRANGEBYSCORE verwenden, wobei Sie die verarbeitete Zeit verwenden. Wenn genau zu diesem Zeitpunkt n Jobs zu bearbeiten sind, können ab ZREMRANGEBYSCORE auch andere Jobs gelöscht werden dauert Zeitintervall.
  • Sie können versuchen, ZSCAN zu verwenden, um die gesamte verzögerte Liste (mit Paginierung) zu scannen und die Punktzahl und Kennung des Jobs zu finden, und dann ZREMRANGEBYLEX mit der Kennung verwenden, um sie zu entfernen.
  • Ein anderer Weg könnte darin bestehen, eine Abbruchbedingung an den Anfang von handle zu setzen Methode. Dieser erfordert die Entwicklung der Anwendungsschicht. Immer wenn Sie einen Job in die Warteschlange verschieben, senden Sie eine Kennung an den Job, geben Sie dieselbe Kennung (die Sie verstehen können) auch in Redis ein (mit EXPIRE). größer als die verzögerte Zeit). Wenn Sie es stornieren möchten, löschen Sie es aus Redis. Prüfen Sie innerhalb der Handle-Methode, ob der angegebene Bezeichner in Redis existiert, falls nicht vorzeitige Rückkehr aus dem Codeblock.