Нет необходимости проверять все отложенные задания. Он поддерживает отсортированный набор в Redis, при этом задания сортируются по запланированному времени. Смотрите код по адресу:
https://github.com/elucid/resque-delayed/blob/master/lib/resque-delayed/resque-delayed.rb
Каждый раз, когда демон просыпается, необходимо проверять только первый элемент набора (используя команду ZRANGEBYSCORE). Демон извлекает соответствующие задания одно за другим, пока опросный запрос не вернет результата, после чего он снова засыпает.
Производительность может быть дополнительно улучшена за счет выборки заданий n за n. Его можно реализовать с помощью Lua-скрипта на стороне сервера в качестве опросного запроса:
local res = redis.call('ZRANGEBYSCORE',KEYS[1], "-inf", ARGV[1], 'LIMIT', 0, 10 )
if #res > 0 then
redis.call( 'ZREMRANGEBYRANK', KEYS[1], 0, #res-1 )
return res
else
return false
end
За один круговорот этот скрипт получает 10 заданий (если доступно) и удаляет их из zset. Гораздо лучше, чем 11 ZRANGEBYSCORE и 10 ZREM, которые в настоящее время требуются Resque-delayed.
25.04.2013