Nie ma na to bezpośredniego ani łatwego sposobu. Opóźnione zadania są przechowywane w sorted sets
jako czas do przetworzenia jako score
i ładunek zadania jako value
.
Istnieje kilka sposobów na usunięcie elementu z posortowanych zestawów (większość z nich wymaga pewnego wysiłku w zależności od rozmiaru opóźnionej kolejki), takich jak
- Otrzymujesz „dokładny” ładunek wysłanego zadania, a następnie używasz ZREM, aby je usunąć. Jest to trudne, ponieważ obiekt (serializowana wersja zadania ze wszystkimi parametrami) może być ogromny i nie można utworzyć "dokładnego" zadania, ponieważ ma unikalny identyfikator. Możesz uzyskać ich listę za pomocą ZRANGEBYSCORE i
WITHSCORES
. Otrzymasz listę zadań wraz z ich wynikami. Możesz użyć wyniku, aby zidentyfikować opóźnioną pracę. Pobierz wartość (serializowany ładunek), a następnie użyjZREM
. - Jeśli jest tylko jedno zadanie do przetworzenia w określonym czasie, możesz użyć ZREMRANGEBYSCORE z wykorzystaniem czasu przetwarzania. Jeśli jest n zadań do przetworzenia dokładnie w tym czasie, inne zadania również mogą zostać usunięte od czasu
ZREMRANGEBYSCORE
zajmuje przedział czasu. - Możesz spróbować użyć ZSCAN, aby przeskanować całą listę opóźnionych (z podziałem na strony) i znaleźć wynik oraz identyfikator zadania, a następnie użyć ZREMRANGEBYLEX z identyfikatorem, aby je usunąć.
- Innym sposobem może być umieszczenie warunku anulowania na początku
handle
metoda. Ten wymaga opracowania warstwy aplikacji. Za każdym razem, gdy wysyłasz zadanie do kolejki, wysyłasz identyfikator do zadania, umieść ten sam identyfikator (który możesz zrozumieć) również w Redis (zEXPIRE
większa niż czas opóźnienia). Jeśli chcesz go anulować, usuń go z Redis. Wewnątrz metody uchwytu sprawdź, czy podany identyfikator istnieje w Redis, jeśli nie wcześniej, wróć z bloku kodu.