Neexistuje žádný přímý nebo snadný způsob, jak to udělat. Zpožděné úlohy jsou uchovávány v sorted sets
jako čas zpracování jako score
a užitečné zatížení úlohy jako value
.
Existuje několik způsobů, jak odstranit prvek ze setříděných sad (většina z nich vyžaduje určité úsilí v závislosti na velikosti zpožděné fronty), například
- Získáte „přesné“ užitečné zatížení odeslané úlohy a poté ji pomocí ZREM odstraníte. Je to těžké, protože objekt (serializovaná verze úlohy se všemi parametry) může být obrovský a nemůžete vytvořit „přesnou“ úlohu, protože má jedinečný identifikátor. Jeho seznam můžete získat pomocí ZRANGEBYSCORE a pomocí
WITHSCORES
. Poskytne vám seznam úloh s jejich skóre. Skóre můžete použít k identifikaci zpožděné úlohy. Získejte hodnotu (serializované užitečné zatížení) a poté použijteZREM
. - Pokud existuje pouze jedna úloha ke zpracování v určitý čas, můžete použít ZREMRANGEBYSCORE s využitím zpracovaného času. Pokud existuje n úloh, které mají být zpracovány přesně v tu dobu, mohou být smazány i jiné úlohy, protože
ZREMRANGEBYSCORE
trvá časový interval. - Můžete se pokusit pomocí ZSCAN naskenovat celý zpožděný seznam (s stránkováním) a najít skóre a identifikátor úlohy a poté použít ZREMRANGEBYLEX s identifikátorem k jeho odstranění.
- Dalším způsobem může být umístění podmínky zrušení na začátek
handle
metoda. Toto vyžaduje vývoj aplikační vrstvy. Kdykoli vložíte úlohu do fronty, pošlete do úlohy identifikátor, vložte stejný identifikátor (kterému rozumíte) také do Redis (sEXPIRE
delší než doba zpoždění). Pokud jej chcete zrušit, odstraňte jej z Redis. Uvnitř metody handle zkontrolujte, zda daný identifikátor v Redis existuje, ne-li předčasný návrat z bloku kódu.