0

我正在开发一个 Ruby on Rails 网站。

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

例子:

一个模型用户有_很多评论。我想将他们有多少评论存储到用户缓存模型中。这样,当我需要显示用户发表的评论数量时,它只是对统计模型的简单查询。每次创建或销毁新评论时,它只会增加或减少计数器。

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

我熟悉 ActiveRecord 事务块,但据我了解,这些是为了保证所有或没有一个整体成功,而不是充当数据库上数据的互斥保护。

基本上有必要关闭网站以进行此类更改吗?

4

3 回答 3

1

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

由于它太旧了,它可能已经过时了。一般的想法是存在的。

于 2012-04-18T21:50:59.053 回答
0

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

如果这一切听起来工作量太大,那么您真的不需要实时报告。假设您有某种备份(热备份或冷备份),运行聚合并生成备份报告。这样它就不会影响正在运行的应用程序,并且您的数据不应超过 24 小时。

于 2012-04-18T21:01:14.960 回答
0

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

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

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

于 2012-04-18T21:48:32.840 回答