如何避免使用Rails不断重新计算摘要数据?

时间:2011-09-10 21:08:19

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

我有一个用户个人资料页面,其侧边栏的用户统计信息与Stack Overflow个人资料页面不同(例如,总访问次数,徽章数量)。

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

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

2 个答案:

答案 0 :(得分:6)

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

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

    例如,如果要衡量徽章数量,您可以在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为你做,如果你使用自定义回调或者你有一些不寻常的情况,你必须自己做。

答案 1 :(得分:0)

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