1

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

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

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

4

2 回答 2

6

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

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

计数器缓存

例如,如果测量徽章的数量,您可以在Usercalled中创建一个数据库字段badges_count,然后在 Badge 模型中, have belongs_to :user, :counter_cache => true。现在,每当徽章数量发生变化时,您无需任何新计算即可访问计数@user.badges_count

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

自定义回调

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

对不一致的担忧

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

于 2011-09-10T21:24:01.810 回答
0

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

于 2011-09-10T22:12:21.520 回答