class Deferrer::Queue
Constants
- ITEM_KEY_PREFIX
- LIST_KEY
Public Class Methods
find(key)
click to toggle source
# File lib/deferrer/queue.rb, line 27 def find(key) return nil unless key item = nil if json = redis.rpop(key) item = Item.from_json(json) end remove(key) item end
find_by_id(id)
click to toggle source
# File lib/deferrer/queue.rb, line 22 def find_by_id(id) return nil unless id find(item_key(id)) end
pop(ignore_time = false)
click to toggle source
# File lib/deferrer/queue.rb, line 18 def pop(ignore_time = false) find(next_key(ignore_time)) end
push(item, timestamp)
click to toggle source
# File lib/deferrer/queue.rb, line 7 def push(item, timestamp) key = item_key(item.id) count = redis.rpush(key, item.to_json) # set score only on first update if count == 1 score = calculate_score(timestamp) redis.zadd(LIST_KEY, score, key) end end
Private Class Methods
calculate_score(timestamp)
click to toggle source
# File lib/deferrer/queue.rb, line 60 def calculate_score(timestamp) timestamp.to_f end
item_key(id)
click to toggle source
# File lib/deferrer/queue.rb, line 64 def item_key(id) "#{ITEM_KEY_PREFIX}:#{id}" end
next_key(ignore_time)
click to toggle source
# File lib/deferrer/queue.rb, line 42 def next_key(ignore_time) if ignore_time redis.zrange(LIST_KEY, 0, 1).first else score = calculate_score(Time.now) redis.zrangebyscore(LIST_KEY, '-inf', score, :limit => [0, 1]).first end end
redis()
click to toggle source
# File lib/deferrer/queue.rb, line 68 def redis Deferrer.redis end
remove(key)
click to toggle source
# File lib/deferrer/queue.rb, line 51 def remove(key) redis.watch(key) redis.multi do redis.del(key) redis.zrem(LIST_KEY, key) end redis.unwatch end