Задержка выполнения / планирование с Redis? - PullRequest
4 голосов
/ 10 ноября 2010

Какие-нибудь хитрости, чтобы сделать отложенное выполнение задачи (то есть планирование) на основе Redis?

Возможно, какой-нибудь умный способ отложить BLPOP на заданное количество секунд? ..

Ответы [ 3 ]

16 голосов
/ 03 декабря 2010

Если вы хотите выполнить планирование с помощью 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

Затем, очень часто (до каждой секунды) вы можете извлекать запланированные задания, которые должны быть запущены (или должны были уже выполняться):

ZRANGEBYSCORE jobs -inf, <current unix timestamp>

Бум, у тебя есть работа.Конечно, обязательно удалите выполненные задания из отсортированного набора.

1 голос
/ 30 декабря 2014

Хотя ответ @ efalcao очень хороший, ваш вопрос может указывать на то, что redis не совсем соответствует потребностям вашего приложения. если ваше приложение имеет вид окна сообщения, рассмотрите возможность использования rabbitMQ с отложенными сообщениями или akka , если вы чувствуете жирным

1 голос
/ 10 ноября 2010

Вы можете работать с кольцом из нескольких списков, которые имеют компонент времени в своем имени. В качестве компонента времени вы можете взять текущую секунду (0-59).

Вы всегда добавляете задачи в список на текущую секунду. Чтобы получить задания, вы делаете BLPOP (с небольшим таймаутом) только в тех списках, где гарантировано, что контент старше указанного количества секунд.

Если вы работаете с нескольких хостов, вам нужно позаботиться о том, чтобы часы были синхронизированы (NTP).

...