ruby-on-rails - 带有自动过期 key 的俄罗斯娃娃片段缓存 - 性能优缺点

标签 ruby-on-rails fragment-caching 37-signals

该问题基于2篇文章:
- Basecamp Next 来自 37signals 的 DHH
- Advanced Caching in Rails通过亚当霍金斯

我对使用俄罗斯娃娃缓存的性能影响有点困惑,具体来说:

  • 当使用自动过期键时,似乎每个请求都会导致访问数据库以获取对象时间戳 - 我是否遗漏了什么? (我知道在最好的情况下,您只需要对层次结构中的顶级键执行此操作,但仍然......)
  • 在第一篇文章中,他们缓存了一个待办事项列表,以及每个待办事项。缓存列表非常有意义,因为它可以节省大量工作(所有项目的数据库查询)。但是为什么要缓存单个项目呢?您已经在数据库中获取 Item 时间戳,那么您究竟在保存什么?生成几行 html?
  • 在第二篇文章中,Adam 像这样缓存了 View 块:cache [post, 'main-content'] ...cache [post, 'comments']添加评论时,它会更改帖子的时间戳,从而使两个整体无效。然而,main-content没有改变——你不想再生它!!!如何仅使评论无效。 (这实际上是一个非常常见的用户案例 - 一个模型有几个逻辑上独立的部分:对象本身、不同的关联、其他存储中的数据等)

  • 对我来说,似乎俄罗斯娃娃缓存只有在嵌套对象的层次结构很深时才有意义。(在大本营中,您有项目-> 待办事项列表 -> 待办事项 -> 项目列表)。但是,如果您的层次结构较浅,最好自己进行失效。

    对于任何反馈,我们都表示感谢!
    谢谢。

    最佳答案

  • 顶层确实需要访问数据库。您可以通过将时间戳存储在单独的缓存条目中来避免这种情况,该条目由模型和 id 键控。第 1 条的评论者之一 (Manuel F. Lara) 提出了同样的建议:“是否有另一个缓存,如项目/15-time,您总是拥有项目列表的最后一个时间戳?”
  • 我认为您对嵌套中的“最低”级别是正确的。您可能需要进行一些测试以查看 DB 访问与呈现微小部分的相对性能。
  • 另一个好点。根据 rails 文档,如果您将符号传递给 :touch除了 updated_at 之外,它还会更新该属性- 也许有一种方法可以跳过更改 Post#updated_at并且只更新像 comments_updated_at 这样的列.然后您可以使用后者进行缓存。但是,如果您试图避免访问数据库,则必须为此时间戳存储另一个缓存键(如上面的 #1)。

  • 我想你必须决定这一切对你来说是否值得。这两篇文章展示了简单的、人为的例子来教授这些原则。在具有复杂关联的应用程序中,“分代”缓存方法可能更易于管理。

    关于ruby-on-rails - 带有自动过期 key 的俄罗斯娃娃片段缓存 - 性能优缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12863915/

    相关文章:

    ruby-on-rails - Rescue_from 不会从 View 或助手中拯救 Timeout::Error

    drupal - 在每个页面上缓存具有 session 特定数据的 Drupal 站点

    ruby-on-rails - 配置 ActiveResource 以支持 OAuth2

    login - 使用网站的子域登录用户

    ruby-on-rails - 使用 Memcached 进行片段缓存

    javascript - 从源代码构建 WysiHat?

    mysql - 错误 : Failed to build gem native extension - Error installing mysql2

    javascript - JQuery UI - 如何从列表框进行多个切换?

    javascript - 如何在 Rails 中使用 Jquery 和 Coffeescript 隐藏元素?

    c# - 清除部分输出缓存