1 回答

TA貢獻1877條經(jīng)驗 獲得超6個贊
沒有直接或簡單的方法可以做到這一點。延遲的作業(yè)保留在sorted sets
待處理時間score
和作業(yè)負載中value
。
有多種方法可以從排序集中刪除元素(大多數(shù)方法需要一些努力,具體取決于延遲隊列的大?。?/p>
您獲得分派作業(yè)的“準(zhǔn)確”有效負載,然后使用ZREM將其刪除。這很困難,因為對象(具有所有參數(shù)的作業(yè)的序列化版本)可能很大,并且您無法創(chuàng)建“精確”作業(yè),因為它具有唯一標(biāo)識符。您可以使用ZRANGEBYSCORE和獲取它的列表
WITHSCORES
。它將為您提供職位列表及其分數(shù)。您可以使用分數(shù)來識別要延遲的工作。獲取值(序列化有效負載)然后使用ZREM
.如果在特定時間只有一項作業(yè)要處理,您可以使用ZREMRANGEBYSCORE并使用處理時間。如果正好有 n 個作業(yè)需要在該時間處理,那么其他作業(yè)也可以被刪除,因為
ZREMRANGEBYSCORE
需要時間間隔。您可以嘗試使用ZSCAN掃描整個延遲列表(帶分頁)并找到作業(yè)的分數(shù)和標(biāo)識符,然后使用ZREMRANGEBYLEX和標(biāo)識符將其刪除。
另一種方法可以是在方法的開頭放置取消條件
handle
。這個需要應(yīng)用層開發(fā)。每當(dāng)您將作業(yè)推送到隊列時,您都會向該作業(yè)發(fā)送一個標(biāo)識符,并將相同的標(biāo)識符(您可以理解的)也放入Redis中(大于EXPIRE
延遲時間)。當(dāng)你想取消它時,然后從Redis中刪除它。在handle方法內(nèi)部檢查Redis中是否存在給定的標(biāo)識符,如果不存在則從代碼塊提前返回。
- 1 回答
- 0 關(guān)注
- 135 瀏覽
添加回答
舉報