Det finns inget direkt eller enkelt sätt att göra det på. De försenade jobben sparas i sorted sets
lika bearbetningstid som score
och jobbnyttolast som value
.
Det finns flera sätt att ta bort ett element från de sorterade uppsättningarna (de flesta av dem kräver vissa ansträngningar beroende på storleken på den försenade kön) som t.ex.
- Du får den "exakta" nyttolasten för det skickade jobbet och använder sedan ZREM för att ta bort det. Det är svårt eftersom objektet (serialiserad version av jobbet med alla parametrar) kan vara enormt och du kan inte skapa det "exakta" jobbet eftersom det har en unik identifierare. Du kan få listan över det med ZRANGEBYSCORE och med
WITHSCORES
. Det kommer att ge dig en lista över jobb med deras poäng. Du kan använda poäng för att identifiera ett försenat jobb. Hämta värdet (serialiserad nyttolast) och använd sedanZREM
. - Om det bara finns ett jobb som ska bearbetas vid en viss tidpunkt kan du använda ZREMRANGEBYSCORE med att använda den bearbetade tiden. Om det finns n jobb som ska behandlas exakt den tiden kan andra jobb också tas bort eftersom
ZREMRANGEBYSCORE
tar tidsintervall. - Du kan försöka använda ZSCAN för att skanna hela den fördröjda listan (med sidnumrering) och hitta poängen och identifieraren för jobbet, och sedan använda ZREMRANGEBYLEX med identifieraren för att ta bort det.
- Ett annat sätt kan vara att sätta ett avbokningsvillkor i början av
handle
metod. Den här kräver utveckling av applikationslager. När du skickar ett jobb till kön skickar du en identifierare till jobbet, lägg in samma identifierare (som du kan förstå) i Redis också (medEXPIRE
längre än den fördröjda tiden). När du vill avbryta det, radera det från Redis. Inuti handtagsmetoden kontrollera om den givna identifieraren finns i Redis, om inte tidig retur från kodblocket.