lib/sidekiq/api.rb in sidekiq-2.15.2 vs lib/sidekiq/api.rb in sidekiq-2.16.0
- old
+ new
@@ -255,10 +255,11 @@
class SortedSet
include Enumerable
def initialize(name)
@zset = name
+ @_size = size
end
def size
Sidekiq.redis {|c| c.zcard(@zset) }
end
@@ -268,27 +269,27 @@
conn.zadd(@zset, timestamp.to_f.to_s, Sidekiq.dump_json(message))
end
end
def each(&block)
- initial_size = size
- deleted_size = 0
+ initial_size = @_size
+ offset_size = 0
page = -1
page_size = 50
loop do
- range_start = page * page_size + deleted_size
- range_end = page * page_size + deleted_size + (page_size - 1)
+ range_start = page * page_size + offset_size
+ range_end = page * page_size + offset_size + (page_size - 1)
elements = Sidekiq.redis do |conn|
conn.zrange @zset, range_start, range_end, :with_scores => true
end
break if elements.empty?
page -= 1
elements.each do |element, score|
block.call SortedEntry.new(self, score, element)
end
- deleted_size = initial_size - size
+ offset_size = initial_size - @_size
end
end
def fetch(score, jid = nil)
elements = Sidekiq.redis do |conn|
@@ -318,16 +319,24 @@
elements_with_jid = elements.map do |element|
message = Sidekiq.load_json(element)
if message["jid"] == jid
- Sidekiq.redis { |conn| conn.zrem(@zset, element) }
+ _, @_size = Sidekiq.redis do |conn|
+ conn.multi do
+ conn.zrem(@zset, element)
+ conn.zcard @zset
+ end
+ end
end
end
elements_with_jid.count != 0
else
- count = Sidekiq.redis do |conn|
- conn.zremrangebyscore(@zset, score, score)
+ count, @_size = Sidekiq.redis do |conn|
+ conn.multi do
+ conn.zremrangebyscore(@zset, score, score)
+ conn.zcard @zset
+ end
end
count != 0
end
end