我有一个用户个人资料页面,其侧边栏的用户统计信息与Stack Overflow个人资料页面不同(例如,总访问次数,徽章数量)。
麻烦的是,目前我正在访问数据库并在每个请求中计算这些统计数据。我可以实现片段缓存来减少这个,但有没有更好的方法来处理这类事情?
将聚合的摘要数据存储在数据库中似乎可能会导致问题(即不一致)。
答案 0 :(得分:6)
您可以使用以下方法将此信息存储在数据库中,而不是重新计算:
例如,如果要衡量徽章数量,您可以在User
中创建一个名为badges_count
的数据库字段,然后在徽章模型中设置belongs_to :user, :counter_cache => true
。现在,只要徽章数量发生变化,您就可以在@user.badges_count
处无需任何新计算的情况下访问计数。
基本实施:http://asciicasts.com/episodes/23-counter-cache-column
假设您有一个字段来衡量比简单计数更复杂的行为。在这种情况下,只需实现使用before_save
,after_save
,before_create
等发生特定操作时更新字段的回调。
如果您做错了,将数据存储在数据库中只会不一致。任何统计信息都可以通过有限数量的路径进行更新,并且应该确保在更新您使用的任何字段时都涵盖所有路径。 Rails使用counter_caching为你做,如果你使用自定义回调或者你有一些不寻常的情况,你必须自己做。
答案 1 :(得分:0)
您可以使用此问题中隐藏的div(Caching data by using hidden divs)。根据您要缓存的数据量,这可能是一个很好的解决方案。