4

Redisに基づいて遅延タスク実行(つまりスケジューリング)を行うためのトリックはありますか?

おそらく、BLPOPを特定の秒数だけ遅らせるための賢い方法はありますか?..

4

3 に答える 3

17

redisでスケジューリングを行いたい場合は、sorted 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

次に、頻繁に(最大で毎秒)実行する必要がある(または今までに実行する必要がある)スケジュールされたジョブをプルできます。

ZRANGEBYSCORE jobs -inf, <current unix timestamp>

ブーム、あなたはあなたの仕事を実行させました。もちろん、ソートされたセットから完了したジョブを必ず削除してください。

于 2010-12-03T03:58:33.820 に答える
1

名前に時間コンポーネントが含まれる複数のリストのリングを操作できます。時間コンポーネントとして、現在の秒(0-59)を取ることができます。

あなたは常に現在の秒のリストにタスクを追加します。ジョブを取得するには、コンテンツが指定された秒数よりも古いことが保証されているリストでのみBLPOP(タイムアウトが少ない)を実行します。

複数のホストから作業する場合は、クロックが同期している(NTP)ことに注意する必要があります。

于 2010-11-10T10:33:52.497 に答える
1

@efalcaoの答えは非常に良いものですが、あなたの質問は、redisがアプリケーションのニーズに完全に適合していないことを示している可能性があります。アプリケーションにメッセージボックスの性質がある場合は、遅延メッセージを備えたrabbitMQの使用を検討してください。大胆に感じる場合は、 akkaを使用してください。

于 2014-12-30T05:08:12.350 に答える