Няма директен или лесен начин да го направите. Забавените задания се съхраняват в sorted sets
като време за обработка като score
и полезен товар на заданието като value
.
Има няколко начина за премахване на елемент от сортираните набори (повечето от тях изискват известни усилия в зависимост от размера на забавената опашка), като
- Получавате „точния“ полезен товар на изпратеното задание и след това използвате ZREM, за да го премахнете. Трудно е, защото обектът (сериализирана версия на заданието с всички параметри) може да бъде огромен и не можете да създадете "точното" задание, защото има уникален идентификатор. Можете да получите списъка с него със ZRANGEBYSCORE и с
WITHSCORES
. Ще ви даде списък с работни места с техните резултати. Можете да използвате оценка, за да идентифицирате забавената работа. Вземете стойността (сериализиран полезен товар), след което използвайтеZREM
. - Ако има само едно задание, което трябва да бъде обработено в определено време, можете да използвате ZREMRANGEBYSCORE с използване на обработеното време. Ако има n задания, които трябва да бъдат обработени точно по това време, други задачи също могат да бъдат изтрити, тъй като
ZREMRANGEBYSCORE
отнема времеви интервал. - Можете да опитате да използвате ZSCAN, за да сканирате целия отложен списък (с пагинация) и да намерите резултата и идентификатора на заданието, след което да използвате ZREMRANGEBYLEX с идентификатора, за да го премахнете.
- Друг начин може да бъде поставянето на условие за анулиране в началото на
handle
метод. Това изисква развитие на приложния слой. Всеки път, когато натискате задание в опашката, изпращате идентификатор към заданието, поставете същия идентификатор (който можете да разберете) и в Redis (сEXPIRE
по-голямо от времето на закъснение). Когато искате да го отмените, след това го изтрийте от Redis. Вътре в метода манипулатор проверете дали даденият идентификатор съществува в Redis, ако не и ранно връщане от кодовия блок.