module Resque::Uniqueue
Public Instance Methods
confirm_compatible_redis_version()
click to toggle source
# File lib/resque/uniqueue.rb, line 123 def confirm_compatible_redis_version redis_version = redis.info["redis_version"] major, minor, patch = redis_version.split(".").map(&:to_i) if major < 2 || (major == 2 && minor < 6) #TODO raise specific exception raise "Redis version must be at least 2.6.0 you are running #{redis_version}" end end
confirm_unique_queue_validity(queue)
click to toggle source
if the queue and set sizes differ, something is very wrong and we should fail loudly
# File lib/resque/uniqueue.rb, line 88 def confirm_unique_queue_validity(queue) response = redis.evalsha queue_and_set_length_equal_eval_sha, [queue] return true if response == 1 #TODO raise specific exception raise "Make sure your queues are empty before you start using uniqueue" end
load_script(script)
click to toggle source
# File lib/resque/uniqueue.rb, line 83 def load_script(script) redis.script :load, script end
pop(queue)
click to toggle source
Calls superclass method
# File lib/resque/uniqueue.rb, line 10 def pop(queue) unique_queue?(queue) ? pop_unique(queue) : super end
pop_unique(queue)
click to toggle source
# File lib/resque/uniqueue.rb, line 27 def pop_unique(queue) queue = "queue:#{queue}" confirm_unique_queue_validity(queue) results = redis.evalsha pop_unique_eval_sha, [queue] return nil unless results[0] job = decode results[0] job["start_at"] ||= results[1].to_i return job end
pop_unique_eval_sha()
click to toggle source
# File lib/resque/uniqueue.rb, line 51 def pop_unique_eval_sha @pop_unique_eval_sha ||= load_script <<-LUA local queue_name = KEYS[1] local uniqueue_name = queue_name..':uniqueue' local start_at_name = queue_name..':start_at' local results = {} results[1] = redis.call('lpop', queue_name) results[2] = redis.call('lpop', start_at_name) if results[1] then redis.call('srem', uniqueue_name, results[1]) end return results LUA end
push(queue, item)
click to toggle source
Calls superclass method
# File lib/resque/uniqueue.rb, line 6 def push(queue, item) unique_queue?(queue) ? push_unique(queue, item) : super end
push_unique(queue, item, time = Time.now.utc.to_i)
click to toggle source
# File lib/resque/uniqueue.rb, line 20 def push_unique(queue, item, time = Time.now.utc.to_i) watch_queue(queue) queue = "queue:#{queue}" redis.evalsha push_unique_eval_sha, [queue], [encode(item), time] end
push_unique_eval_sha()
click to toggle source
# File lib/resque/uniqueue.rb, line 37 def push_unique_eval_sha @push_unique_eval_sha ||= load_script <<-LUA local queue_name = KEYS[1] local uniqueue_name = queue_name..':uniqueue' local start_at_name = queue_name..':start_at' local not_in_set = redis.call('sadd', uniqueue_name , ARGV[1]) if not_in_set == 1 then redis.call('rpush', start_at_name, ARGV[2]) return redis.call('rpush', queue_name, ARGV[1]) end return false LUA end
queue_and_set_length_equal_eval_sha()
click to toggle source
# File lib/resque/uniqueue.rb, line 66 def queue_and_set_length_equal_eval_sha @queue_and_set_length_equal_eval_sha ||= load_script <<-LUA local queue_name = KEYS[1] local uniqueue_name = queue_name..':uniqueue' local start_at_name = queue_name..':start_at' local queue_size = redis.call('llen', queue_name) local uniqueue_size = redis.call('scard', uniqueue_name) local start_at_size = redis.call('llen', start_at_name) if queue_size == uniqueue_size then if queue_size == start_at_size then return true end end return false LUA end
remove_queue(queue)
click to toggle source
Calls superclass method
# File lib/resque/uniqueue.rb, line 14 def remove_queue(queue) super(queue) redis.del("queue:#{queue}:uniqueue") redis.del("queue:#{queue}:start_at") end
unique_queue?(queue)
click to toggle source
is this queue a unique queue if you have uniqueue turned on and no queues are set, its assumes all queues are unique
# File lib/resque/uniqueue.rb, line 97 def unique_queue?(queue) return false unless unique_queues? !unique_queues || unique_queues.include?(queue) end
unique_queues()
click to toggle source
list the unique queues
# File lib/resque/uniqueue.rb, line 103 def unique_queues @unique_queues end
unique_queues!()
click to toggle source
turn on unique queues
# File lib/resque/uniqueue.rb, line 113 def unique_queues! confirm_compatible_redis_version @unique_queues_enabled = true end
unique_queues=(unique_queues)
click to toggle source
set a specific list of unique queues
# File lib/resque/uniqueue.rb, line 108 def unique_queues=(unique_queues) @unique_queues = unique_queues end
unique_queues?()
click to toggle source
are unique queues turned on?
# File lib/resque/uniqueue.rb, line 119 def unique_queues? !!@unique_queues_enabled end