In order to reduce memory consumption on an API call (using ruby-grape) I'm attempting to calculate data in a background job (Delayed Job, eventually Sidekiq), populate a Redis cache and return the results.
Here is the DelayedJob that populates the cache
class LotService def self.cache_recently_removed_lot_ids lot_ids = Lot.ids_removed_from_syndication_in_last(60) lot_ids.concat Lot.ids_hidden_in_last(60) lot_ids.concat Lot.ids_unpublished_in_last(60) Rails.cache.write(:recently_removed_lot_ids, lot_ids, expires_at: DateTime.current + 1.hour) endend
Here is the API endpoint. Within the 10.times
iteration the Cache results never return. If I make a subsequent call to the API endpoint the results are there.
lot_ids = []10.times do |iteration| lot_ids = Rails.cache.read(:recently_removed_lot_ids) break if lot_ids.present? # Run on first iteration and if job isn't already queued LotsRecentlyRemovedCacheJob.perform_later if !LotsRecentlyRemovedCacheJob.already_queued? && iteration.zero? sleep 2endcontent_type 'application/json'lot_ids.present? ? lot_ids.sort! : []
Why would the iterative calls to Rails.cache.read
not return a result once the cache had been populated by the background job?