lib/searchkick/reindex_queue.rb in searchkick-4.5.0 vs lib/searchkick/reindex_queue.rb in searchkick-4.5.1

- old
+ new

@@ -12,15 +12,21 @@ Searchkick.with_redis { |r| r.lpush(redis_key, record_id) } end # TODO use reliable queuing def reserve(limit: 1000) - record_ids = Set.new - while record_ids.size < limit && (record_id = Searchkick.with_redis { |r| r.rpop(redis_key) }) - record_ids << record_id + if supports_rpop_with_count? + Searchkick.with_redis { |r| r.call("rpop", redis_key, limit) } + else + record_ids = [] + Searchkick.with_redis do |r| + while record_ids.size < limit && (record_id = r.rpop(redis_key)) + record_ids << record_id + end + end + record_ids end - record_ids.to_a end def clear Searchkick.with_redis { |r| r.del(redis_key) } end @@ -31,8 +37,16 @@ private def redis_key "searchkick:reindex_queue:#{name}" + end + + def supports_rpop_with_count? + redis_version >= Gem::Version.new("6.2") + end + + def redis_version + @redis_version ||= Searchkick.with_redis { |r| Gem::Version.new(r.info["redis_version"]) } end end end