2010-11-09 75 views

回答

1

你可以用那些在他們的名字時組件多個列表的環工作。作爲時間分量,您可以選擇當前秒(0-59)。

您總是將任務添加到當前列表中。要獲得這些工作,你只能在那些有保證的列表上做一個BLPOP(低超時),這個列表的內容比給定的秒數早。

如果你從多個主機工作,你必須注意時鐘是同步的(NTP)。

15

如果你想要做的Redis調度,我會建議使用的有序set(在Z *)的命令:

http://code.google.com/p/redis/wiki/SortedSets

你可以做的是這樣的:

ZADD jobs <unix timestamp of when you want the job to run> <job identifier> 

例如:

ZADD jobs 1291348355 

然後,每隔一段時間(直到每個secon d)你可以拉預定的工作,應該運行(或應該已經運行了):

ZRANGEBYSCORE jobs -inf, <current unix timestamp> 

繁榮,你有你的工作運行。當然,請確保從已排序集合中刪除已完成的作業。

+0

很酷,但我想要獲得BLPOP語義。也就是說,我需要對Redis進行查詢,直到我有一些東西可以運行。一秒的粒度不是很健壯。 – 2010-12-03 04:29:34

+1

你是更安排還是排隊?我想這取決於你工作的精度。當我想到按照「在2小時內」或「在每個小時內」等等的方式來安排工作時,我沒有看到在該用例中亞秒級調度精度成爲問題。 排隊/背景聽起來更像你正在尋找的東西,那就是:「我想把工作推到背景並讓工作人員在排隊後立即就緒。」在這種情況下,BLPOP具有很大的意義。我使用類似於後臺處理流數據的方法(例如twitter內容)。 – efalcao 2010-12-03 05:38:59

+2

哦,老線程,但 - 亞歷山大 - 你可以使用一種調度程序線程,它每隔N秒檢查一次已排序的集合,並將主要作業工作者正在blpop的作業從已排序的集合移動到主作業列表中。 – 2012-08-20 12:13:41

1

雖然@ efalcao的答案是非常好的答案,但您的問題可能表明,redis完全符合您的應用程序需求。 如果您的應用程序具有消息框的性質,請考慮使用rabbitMQ其中包含延遲消息或akka如果您感覺大膽