1
0
Fork 0
mirror of https://github.com/mperham/sidekiq.git synced 2022-11-09 13:52:34 -05:00

Merge pull request #1277 from aackerman/api-deletion-support-memoization

Memoize size of a SortedSet to reduce calls to Redis when iterating
This commit is contained in:
Mike Perham 2013-10-24 09:34:54 -07:00
commit 1b2343e9d9

View file

@ -257,6 +257,7 @@ module Sidekiq
def initialize(name)
@zset = name
@_size = size
end
def size
@ -270,14 +271,14 @@ module Sidekiq
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
@ -286,7 +287,7 @@ module Sidekiq
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
@ -320,13 +321,21 @@ module Sidekiq
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