Er is geen directe of gemakkelijke manier om het te doen. De uitgestelde taken worden bewaard in sorted sets
als te verwerken tijd als score
en taaklading als de value
.
Er zijn verschillende manieren om een element uit de gesorteerde sets te verwijderen (de meeste vereisen enige inspanning, afhankelijk van de grootte van de vertraagde wachtrij), zoals
- U krijgt de "exacte" lading van de verzonden taak en gebruikt vervolgens ZREM om deze te verwijderen. Het is moeilijk omdat het object (geserialiseerde versie van de taak met alle parameters) enorm kan zijn en u de "exacte" taak niet kunt maken omdat deze een unieke identificatie heeft. Je kunt de lijst ervan krijgen met ZRANGEBYSCORE en met
WITHSCORES
. Het geeft je de lijst met banen met hun scores. U kunt de score gebruiken om een vertraagde taak te identificeren. Verkrijg de waarde (geserialiseerde payload) en gebruik vervolgensZREM
. - Als er slechts één taak op een bepaald tijdstip moet worden verwerkt, kunt u ZREMRANGEBYSCORE gebruiken met de verwerkingstijd. Als er precies op dat moment n taken zijn die moeten worden verwerkt, kunnen ook andere taken worden verwijderd sinds
ZREMRANGEBYSCORE
kost tijdsinterval. - U kunt proberen ZSCAN te gebruiken om de hele vertraagde lijst (met paginering) te scannen en de score en identifier van de taak te vinden, en dan ZREMRANGEBYLEX gebruiken met de identifier om deze te verwijderen.
- Een andere manier zou kunnen zijn om een annuleringsvoorwaarde aan het begin van
handle
te plaatsen methode. Deze vereist ontwikkeling van de applicatielaag. Telkens wanneer u een taak naar de wachtrij duwt, stuurt u een identifier naar de taak, plaats dezelfde identifier (die u begrijpt) ook in Redis (metEXPIRE
groter is dan de vertraagde tijd). Als je het wilt annuleren, verwijder het dan uit de Redis. Controleer in de handle-methode of de gegeven identifier bestaat in Redis, zo niet vroege terugkeer uit het codeblok.