resque 
resque是ruby on rails下面的一个异步工作分配框架, 它利用redis的队列功能,
来达到异步处理工作的目的. 好处在于使用简便以及很容易和rails整合.
项目地址在
https://github.com/defunkt/resque ,
如何使用里面写的很清楚, 这里就不多说了. 具体逻辑也没有什么好说的,
无非是需要调用任务了, 塞任务到队列里面, 然后worker取队列,
然后把任务做掉.
一些细节:
resque是如何enque的? 
1 
redis . rpush  "queue: #{ queue } " ,  encode ( item ) 
 
presistance如何做? 
1 
encode :  MultiJson . decode ( object ) 
 
resque是如何取work的? 
1 
decode  redis . lpop ( "queue: #{ queue } " ) 
 
resque-scheduler 
resque-scheduler是基于resque的一个计划任务插件, 简单地说,
就是能够利用它来做一些定时和定时循环的任务. 项目主页:
https://github.com/bvandenbos/resque-scheduler ,
使用方法我也不多说了. 项目主页上都有.
resque-scheduler计划的队列如何处理? 
1 
2 
3 
4 
5 
6 
7 
# First add this item to the list for this timestamp 
redis . rpush ( "delayed: #{ timestamp . to_i } " ,  encode ( item )) 
 # Now, add this timestamp to the zsets.  The score and the value are 
# the same since we'll be querying by timestamp, and we don't have 
# anything else to store. 
redis . zadd  :delayed_queue_schedule ,  timestamp . to_i ,  timestamp . to_i 
 
竟然根据每个timestamp做了一个队列.. 计划任务都保存到一个sorted set里面.
scheduler如何检查是否有新的任务? 
核心在于这段代码:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
if  timestamp  =  Resque . next_delayed_timestamp ( at_time ) 
  enqueue_delayed_items_for_timestamp ( timestamp ) 
 
 resque_scheduler . rb : 
 def  next_delayed_timestamp ( at_time = nil ) 
  items  =  redis . zrangebyscore  :delayed_queue_schedule ,  '-inf' ,  ( at_time  ||  Time . now ) . to_i ,  :limit  =>  [ 0 ,  1 ] 
   timestamp  =  items . nil?  ?  nil  :  Array ( items ) . first 
   timestamp . to_i  unless  timestamp . nil? 
 end 
 
enqueue_delayed_items_for_timestamp比较复杂, 就不贴了.
结论 
基本上resque的逻辑很直观, 和想象中的一样. resque-scheduler就不一样了.
复杂很多.
我学习他们的示例代码放在:
https://bitbucket.org/linjunhalida/code-example/src/tip/ruby/resque /