缓存活动模型序列化程序中的关联

时间:2014-01-03 01:24:28

标签: memcached active-model-serializers

目前,我有以下序列化程序:

class UserSerializer < ActiveModel::Serializer
  cached
  delegate :cache_key, to: :object
  has_many :profiles
end

class ProfileSerializer < ActiveModel::Serializer
  cached
  delegate :cache_key, to: :object
  has_many :pages
end

class PageSerializer < ActiveModel::Serializer
  cached
  delegate :cache_key, to: :object
  has_many :posts
end

由于各种原因,我需要在序列化用户模型时序列化所有相关的配置文件,页面和帖子。不幸的是,这导致了一个相当大的JSON哈希难以高效缓存 - 我的本地memcached服务器只能存储大约75个序列化用户。有没有办法设置序列化程序,以便不是缓存整个用户模型JSON的输出,我只缓存JSON的唯一部分,并提交另一个缓存提取,以检索关联的配置文件,页面和帖子?

1 个答案:

答案 0 :(得分:0)

我认为在ActiveModel::Serializers内没有办法做到这一点。您可以减少缓存大小,但代价是使代码复杂化。像这样的东西会起作用:

user_json = UserSerializer.new(@user).as_json
user_json[:profiles] = @user.profiles.map { |profile| ProfileSerializer.new(profile).as_json }
etc.

在您的示例中,当然需要更多嵌套。

这不是一个很好的解决方案 - 如果你必须返回深度嵌套的JSON,我认为最好的短期选择是增加一些内存缓存容量。长期来看,重新考虑这种方法可能是值得的,因为一次归还所有东西可能是不可持续的。