Unuse ActiveRecord::Base#cache_key (#8185)

* Unuse ActiveRecord::Base#cache_key

* Enable cache_versioning

* Call cache_collection
This commit is contained in:
abcang 2018-08-19 22:52:38 +09:00 committed by Eugen Rochko
parent 0d1d9b9a33
commit 9e75aa30cd
6 changed files with 9 additions and 17 deletions

View File

@ -42,7 +42,7 @@ class AccountsController < ApplicationController
format.json do format.json do
skip_session! skip_session!
render_cached_json(['activitypub', 'actor', @account.cache_key], content_type: 'application/activity+json') do render_cached_json(['activitypub', 'actor', @account], content_type: 'application/activity+json') do
ActiveModelSerializers::SerializableResource.new(@account, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter) ActiveModelSerializers::SerializableResource.new(@account, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter)
end end
end end

View File

@ -17,8 +17,7 @@ class Api::V1::StatusesController < Api::BaseController
CONTEXT_LIMIT = 4_096 CONTEXT_LIMIT = 4_096
def show def show
cached = Rails.cache.read(@status.cache_key) @status = cache_collection([@status], Status).first
@status = cached unless cached.nil?
render json: @status, serializer: REST::StatusSerializer render json: @status, serializer: REST::StatusSerializer
end end

View File

@ -103,12 +103,8 @@ class ApplicationController < ActionController::Base
return raw unless klass.respond_to?(:with_includes) return raw unless klass.respond_to?(:with_includes)
raw = raw.cache_ids.to_a if raw.is_a?(ActiveRecord::Relation) raw = raw.cache_ids.to_a if raw.is_a?(ActiveRecord::Relation)
uncached_ids = [] cached_keys_with_value = Rails.cache.read_multi(*raw).transform_keys(&:id)
cached_keys_with_value = Rails.cache.read_multi(*raw.map(&:cache_key)) uncached_ids = raw.map(&:id) - cached_keys_with_value.keys
raw.each do |item|
uncached_ids << item.id unless cached_keys_with_value.key?(item.cache_key)
end
klass.reload_stale_associations!(cached_keys_with_value.values) if klass.respond_to?(:reload_stale_associations!) klass.reload_stale_associations!(cached_keys_with_value.values) if klass.respond_to?(:reload_stale_associations!)
@ -116,11 +112,11 @@ class ApplicationController < ActionController::Base
uncached = klass.where(id: uncached_ids).with_includes.map { |item| [item.id, item] }.to_h uncached = klass.where(id: uncached_ids).with_includes.map { |item| [item.id, item] }.to_h
uncached.each_value do |item| uncached.each_value do |item|
Rails.cache.write(item.cache_key, item) Rails.cache.write(item, item)
end end
end end
raw.map { |item| cached_keys_with_value[item.cache_key] || uncached[item.id] }.compact raw.map { |item| cached_keys_with_value[item.id] || uncached[item.id] }.compact
end end
def respond_with_error(code) def respond_with_error(code)
@ -135,7 +131,6 @@ class ApplicationController < ActionController::Base
def render_cached_json(cache_key, **options) def render_cached_json(cache_key, **options)
options[:expires_in] ||= 3.minutes options[:expires_in] ||= 3.minutes
cache_key = cache_key.join(':') if cache_key.is_a?(Enumerable)
cache_public = options.key?(:public) ? options.delete(:public) : true cache_public = options.key?(:public) ? options.delete(:public) : true
content_type = options.delete(:content_type) || 'application/json' content_type = options.delete(:content_type) || 'application/json'

View File

@ -9,7 +9,7 @@ class EmojisController < ApplicationController
format.json do format.json do
skip_session! skip_session!
render_cached_json(['activitypub', 'emoji', @emoji.cache_key], content_type: 'application/activity+json') do render_cached_json(['activitypub', 'emoji', @emoji], content_type: 'application/activity+json') do
ActiveModelSerializers::SerializableResource.new(@emoji, serializer: ActivityPub::EmojiSerializer, adapter: ActivityPub::Adapter) ActiveModelSerializers::SerializableResource.new(@emoji, serializer: ActivityPub::EmojiSerializer, adapter: ActivityPub::Adapter)
end end
end end

View File

@ -33,7 +33,7 @@ class StatusesController < ApplicationController
format.json do format.json do
skip_session! unless @stream_entry.hidden? skip_session! unless @stream_entry.hidden?
render_cached_json(['activitypub', 'note', @status.cache_key], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do render_cached_json(['activitypub', 'note', @status], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do
ActiveModelSerializers::SerializableResource.new(@status, serializer: ActivityPub::NoteSerializer, adapter: ActivityPub::Adapter) ActiveModelSerializers::SerializableResource.new(@status, serializer: ActivityPub::NoteSerializer, adapter: ActivityPub::Adapter)
end end
end end
@ -43,7 +43,7 @@ class StatusesController < ApplicationController
def activity def activity
skip_session! skip_session!
render_cached_json(['activitypub', 'activity', @status.cache_key], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do render_cached_json(['activitypub', 'activity', @status], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do
ActiveModelSerializers::SerializableResource.new(@status, serializer: ActivityPub::ActivitySerializer, adapter: ActivityPub::Adapter) ActiveModelSerializers::SerializableResource.new(@status, serializer: ActivityPub::ActivitySerializer, adapter: ActivityPub::Adapter)
end end
end end

View File

@ -24,8 +24,6 @@
# #
class Status < ApplicationRecord class Status < ApplicationRecord
self.cache_versioning = false
include Paginable include Paginable
include Streamable include Streamable
include Cacheable include Cacheable