diff options
Diffstat (limited to 'app/models/feed.rb')
-rw-r--r-- | app/models/feed.rb | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/app/models/feed.rb b/app/models/feed.rb index e7f2ab3a5..45cb923d1 100644 --- a/app/models/feed.rb +++ b/app/models/feed.rb @@ -16,7 +16,7 @@ class Feed RegenerationWorker.perform_async(@account.id, @type) @statuses = Status.send("as_#{@type}_timeline", @account).paginate_by_max_id(limit, nil, nil) else - status_map = Status.where(id: unhydrated).with_includes.with_counters.map { |status| [status.id, status] }.to_h + status_map = cache(unhydrated) @statuses = unhydrated.map { |id| status_map[id] }.compact end @@ -25,6 +25,29 @@ class Feed private + def cache(ids) + raw = Status.where(id: ids).to_a + uncached_ids = [] + cached_keys_with_value = Rails.cache.read_multi(*raw.map(&:cache_key)) + + raw.each do |status| + uncached_ids << status.id unless cached_keys_with_value.key?(status.cache_key) + end + + unless uncached_ids.empty? + uncached = Status.where(id: uncached_ids).with_includes.map { |s| [s.id, s] }.to_h + + uncached.values.each do |status| + Rails.cache.write(status.cache_key, status) + end + end + + cached = cached_keys_with_value.values.map { |s| [s.id, s] }.to_h + cached.merge!(uncached) unless uncached_ids.empty? + + cached + end + def key FeedManager.instance.key(@type, @account.id) end |