如何在不删除网站的情况下在数据库中构建缓存的统计信息?

时间:2012-04-18 19:57:56

标签: ruby-on-rails database caching

我正在开发Ruby on Rails网站。

为了提高性能,我想构建一些各种统计信息的缓存,以便将来在显示它们时,我只需要显示缓存而不是拉动所有数据库记录来计算这些统计信息。

示例:

模型用户has_many评论。我想在用户缓存模型中存储他们有多少条评论。这样,当我需要显示用户所做的评论数量时,它只是对统计模型的简单查询。每次创建或销毁新评论时,它只会递增或递减计数器。

如何在网站上线时制作这些统计信息?我担心的是,在我请求数据库计算用户的注释数量之后,但在能够执行命令将其保存到统计数据之前,该用户可能会潜入并在某处添加其他注释。这会增加计数器,但会被另一个线程立即覆盖,导致保存不正确的统计数据。

我熟悉ActiveRecord事务块,但据我了解,那些是为了保证所有或全部都不成功,而不是作为数据库上数据的互斥保护。

基本上有必要取消网站以进行类似的更改吗?

3 个答案:

答案 0 :(得分:1)

您的用例已由rails处理。它被称为计数器缓存。这里有一个导轨:http://railscasts.com/episodes/23-counter-cache-column

由于它太旧了,它可能已经过时了。但总的想法是。

答案 1 :(得分:0)

将应用程序和报告逻辑混合在一起通常不是最佳实践。将报告数据发送到应用程序之外,发送到另一个数据库,记录守护程序读取的文件,或者处理存储细节的其他API。

如果所有这些听起来都太多了,那么你真的不想要实时报道。假设您有某种备份(热备份或冷备份)运行聚合并生成备份报告。这样它不会影响正在运行的应用程序,并且您的数据不应超过24小时。

答案 2 :(得分:0)

仅供参考,我想我在这里找到了解决方案:

http://guides.ruby.tw/rails3/active_record_querying.html#5

我正在寻找的是悲观锁定,并在2.10.2中解决。