Non esiste un modo diretto o semplice per farlo. I lavori ritardati vengono mantenuti in sorted sets
come tempo da elaborare come score
e carico utile del lavoro come value
.
Esistono diversi modi per rimuovere un elemento dagli insiemi ordinati (la maggior parte di essi richiede alcuni sforzi a seconda delle dimensioni della coda ritardata) come
- Ottieni il payload "esatto" del lavoro inviato e quindi utilizza ZREM per rimuoverlo. È difficile perché l'oggetto (versione serializzata del lavoro con tutti i parametri) può essere enorme e non è possibile creare il lavoro "esatto" perché ha un identificatore univoco. Puoi ottenerne l'elenco con ZRANGEBYSCORE e con
WITHSCORES
. Ti darà l'elenco dei lavori con i loro punteggi. È possibile utilizzare il punteggio per identificare il lavoro in ritardo. Ottieni il valore (payload serializzato), quindi usaZREM
. - Se c'è un solo lavoro da elaborare in un momento specifico, puoi utilizzare ZREMRANGEBYSCORE con l'utilizzo del tempo di elaborazione. Se ci sono n lavori da elaborare esattamente in quel momento, è possibile eliminare anche altri lavori poiché
ZREMRANGEBYSCORE
richiede un intervallo di tempo. - Puoi provare a utilizzare ZSCAN per scansionare l'intero elenco ritardato (con impaginazione) e trovare il punteggio e l'identificatore del lavoro, quindi utilizzare ZREMRANGEBYLEX con l'identificatore per rimuoverlo.
- Un altro modo potrebbe essere inserire una condizione di annullamento all'inizio di
handle
metodo. Questo richiede lo sviluppo del livello di applicazione. Ogni volta che spingi un lavoro nella coda, invii un identificatore al lavoro, inserisci lo stesso identificatore (che puoi capire) anche in Redis (conEXPIRE
maggiore del tempo di ritardo). Quando vuoi cancellarlo, eliminalo dal Redis. All'interno del metodo handle verifica se l'identificatore specificato esiste in Redis, se non viene restituito in anticipo dal blocco di codice.