1

シリアライザーをキャッシュしようとしていますが、キャッシュには応答時間が遅くなるという問題があります。

シリアライザーは次のようになります

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 を委譲した場合...サイドロードされた関係 (所有者、投稿) が読み込まれません... 応答にそれらが含まれていませんか?

4

0 に答える 0