【问题标题】:What is the best way to store an ActiveRecord object in memcached?在 memcached 中存储 ActiveRecord 对象的最佳方法是什么?
【发布时间】:2011-01-24 12:54:35
【问题描述】:

目前在 memcached 中存储 ActiveRecord 对象存在两个问题。

  1. 未定义的类/模块问题 (Google search)。根据我的阅读,这仍然是一个没有人有真正好的解决方案的错误。 cache_fu 插件可能有最好的解决方案,将它的检索调用包装在一个块中,试图捕获这个错误,解析消息并尝试加载未定义的类/模块。

  2. 臭名昭著的 LH 票 #1339 (LH Ticket)。仅当您将 cache_classes 设置为 FALSE(开发、测试)时才会发生此错误。

在谷歌上搜索了数周后,我仍然没有找到一种在 memcached 中存储 AR 实例而无需处理上面列出的 2 个问题的好方法。

我还没有尝试过的想法是将实例中的属性作为字符串删除(就像 AR 在进行类型转换之前如何从数据库接收它们),将它们存储在 memcached 中,然后以某种方式从缓存中检索使用这些值实例化一个 AR 对象。这可能吗?如果是这样,最好的方法是什么?

我只是在寻找其他 Rails 开发人员解决此问题的方法。

【问题讨论】:

    标签: ruby-on-rails activerecord caching memcached


    【解决方案1】:

    在我们的项目中,我们将对象存储为 XML。

    cache.write(user.cache_key, user.to_xml) # write to cache
    User.new(Hash.from_xml(cache.read(cache_key))) # reach from cache xml
    

    序列化/反序列化 XML 有一些额外的成本。但这使我们能够在非 Ruby 应用程序之间共享缓存。

    【讨论】:

    • 我喜欢这个主意,会试试看
    • 此时我可能会选择 JSON。无论如何,我发现在 memcached 中存储除字符串、整数和相同数组之外的任何东西都是疯狂的。
    • 当您依赖从缓存中检索到的 AR 对象来响应 #new_record 时,这不能很好地工作?和#id 就像从数据库加载一样。此方法只是创建一个新的未保存的 AR 对象,该对象恰好与真实对象共享一些属性。
    • AR 模型缓存通常保存持久化的对象,因此缓存记录将始终响应 falsenew_record? 查询。
    • 此解决方案通常会产生此错误:WARNING: Can't mass-assign protected attributes: id
    猜你喜欢
    • 2020-11-23
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2015-08-17
    • 2016-02-28
    • 1970-01-01
    相关资源
    最近更新 更多