【问题标题】:How do I avoid constantly re-calculating summary data using Rails?如何避免使用 Rails 不断地重新计算汇总数据?
【发布时间】:2011-09-10 21:08:19
【问题描述】:

我有一个用户个人资料页面,其中有一个带有用户统计信息的侧边栏,类似于 Stack Overflow 个人资料页面(例如,总访问量、徽章数量)。

问题在于,目前我正在访问数据库并针对每个请求计算这些统计信息。我可以实现片段缓存来减少这种情况,但是有没有更好的方法来处理这种类型的事情?

将汇总的汇总数据存储在数据库中似乎可能会导致问题(即不一致)。

【问题讨论】:

    标签: ruby-on-rails caching fragment-caching


    【解决方案1】:

    您可以将此信息存储在数据库中,而不是重新计算它,使用:

    1. 计数器缓存
    2. 自定义回调

    计数器缓存

    例如,如果测量徽章的数量,您可以在 User 中创建一个名为 badges_count 的数据库字段,然后在徽章模型中,拥有 belongs_to :user, :counter_cache => true。现在,每当徽章数量发生变化时,您都可以通过 @user.badges_count 访问计数,而无需进行任何新的计算。

    一个基本的实现:http://asciicasts.com/episodes/23-counter-cache-column

    自定义回调

    假设您有一个比简单计数更复杂的衡量行为的字段。在这种情况下,只需使用before_saveafter_savebefore_create 等实现在发生特定操作时更新字段的回调。

    对不一致的担忧

    如果你做错了,在你的数据库中存储数据只会是不一致的。可以通过有限数量的路径更新任何统计信息,并且您应该确保在更新您正在使用的任何字段时涵盖所有路径。 Rails 使用 counter_caching 为你做这件事,如果你使用自定义回调或遇到一些不寻常的情况,你必须自己做。

    【讨论】:

      【解决方案2】:

      您可以在这个问题 (Caching data by using hidden divs) 中使用隐藏的 div。根据您要缓存的数据量,这可能是一个不错的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-10
        • 1970-01-01
        • 2019-08-18
        • 2012-02-28
        • 2015-10-16
        • 2022-01-27
        • 1970-01-01
        相关资源
        最近更新 更多