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像这样在课堂上添加了一个

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)

如果没有缓存实现,相同的请求会在 29 毫秒内返回

14:05:38 web.1       | Completed 200 OK in 29ms (Views: 26.9ms)

有什么想法会出错吗?

object.cache_key返回一个一致的缓存键,当某些无效属性更改时该键失效...

序列化程序还返回一个一致的缓存键......并且找到了该缓存版本。如果我将 cache_key 委托给对象...未加载侧载关系(所有者,帖子)...响应不包含它们?

4

0 回答 0