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