Der er ingen direkte eller nem måde at gøre det på. De forsinkede job opbevares i sorted sets
som skal behandles som score
og jobnyttelast som value
.
Der er flere måder at fjerne et element fra de sorterede sæt (de fleste af dem kræver en vis indsats afhængigt af størrelsen af den forsinkede kø) såsom
- Du får den "nøjagtige" nyttelast af det afsendte job og bruger derefter ZREM til at fjerne det. Det er svært, fordi objektet (serialiseret version af jobbet med alle parametre) kan være enormt, og du kan ikke oprette det "nøjagtige" job, fordi det har en unik identifikator. Du kan få listen over det med ZRANGEBYSCORE og med
WITHSCORES
. Det vil give dig listen over job med deres score. Du kan bruge score til at identificere et forsinket job. Hent værdien (serialiseret nyttelast) og brug derefterZREM
. - Hvis der kun er ét job, der skal behandles på et bestemt tidspunkt, kan du bruge ZREMRANGEBYSCORE med at bruge den behandlede tid. Hvis der er n job, der skal behandles præcis på det tidspunkt, kan andre job også slettes, da
ZREMRANGEBYSCORE
tager tidsinterval. - Du kan prøve at bruge ZSCAN til at scanne hele den forsinkede liste (med paginering) og finde jobbets score og identifikator, og derefter bruge ZREMRANGEBYLEX med identifikatoren til at fjerne det.
- En anden måde kunne være at sætte en annulleringsbetingelse i begyndelsen af
handle
metode. Denne kræver udvikling af applikationslag. Når du skubber et job til køen, sender du en identifikator til jobbet, læg samme identifikator (som du kan forstå) i Redis også (medEXPIRE
større end den forsinkede tid). Når du vil annullere det, skal du slette det fra Redis. Inde i håndteringsmetoden skal du kontrollere, om den givne identifikator findes i Redis, hvis ikke tidlig tilbagevenden fra kodeblokken.