シリアライザーをキャッシュしようとしていますが、キャッシュには応答時間が遅くなるという問題があります。
シリアライザーは次のようになります
class FeedSerializer < ActiveModel::Serializer
cached
embed :ids
has_one :owner, include: true, serializer: UserSerializer, root: :users
has_one :post, include: true
attributes :id, :type
def cache_key
Digest::SHA1.hexadigest([object.cache_key, owner, post].join('/'))
end
end
cache_key
そして、私はこのようにクラスにaを追加しました
class Feed
# ...some fields and class functions...
field :key, type: String
field :title, type: String
def cache_key
[ self.key, self.title ]
end
end
そしてコントローラーで
# GET /feeds
def index
@feed = current_user.feeds.recent.includes(:owners)
render json: @feed
end
問題は、キャッシュがヒットしても、この実装がコントローラーを遅くすることです...
14:03:40 web.1 | Cache read: feed_serializer/f81fef05948d17506bf0d0923aa35e593208a21c/serializable-hash
14:03:40 web.1 | Cache fetch_hit: feed_serializer/f81fef05948d17506bf0d0923aa35e593208a21c/serializable-hash
14:03:40 web.1 | Completed 200 OK in 50ms (Views: 46.9ms)
キャッシュの実装がなければ、同じリクエストが29msで返されましたか?
14:05:38 web.1 | Completed 200 OK in 29ms (Views: 26.9ms)
何が間違っているのでしょうか?
は、無効化属性の一部が変更されたときに無効化される一貫性のobject.cache_key
あるキャッシュ キーを返します...
シリアライザーは一貫したキャッシュキーも返します...そして、そのキャッシュされたバージョンが見つかります。オブジェクトに cache_key を委譲した場合...サイドロードされた関係 (所有者、投稿) が読み込まれません... 応答にそれらが含まれていませんか?