使用SQL数据库Highload Web项目

时间:2010-11-21 21:43:34

标签: sql concurrency database-concurrency

我想问一个关于使用SQL数据库进行高负载Web应用程序开发的方法的问题。 假设我们有简单的CMS系统,可以访问不同的文章。我们还想在数据库中存储文章访问量。每次用户观看文章时,此访问计数器都会增加。

就SQL数据库而言,我们在“文章”表中有“访问”整数字段,我们需要在每次用户访问文章时增加该字段。如果文章有大量并发访问,则必须正确修改当前数据库行的“访问”字段值。

我使用悲观锁定方法:“SELECT .. FOR UPDATE”。每当用户访问某篇文章时,我都会锁定“文章”表格中的特定行,并增加“访问”计数器。

这种做法是否正确?

我在我的项目中使用MySQL数据库。

2 个答案:

答案 0 :(得分:2)

这种方法适用于中等负载站点,但最终会出现锁定问题。

在负载很高的网站上,您需要实现一个消息队列,并将“已访问”事件发送到队列。

脱机进程将读取队列并相应地更新列。这将允许任何时候只有一个进程访问该特定列。

答案 1 :(得分:2)

我绝对不建议在文章数据中存储汇总数据(如“访问次数”),而是使用一个单独的表格来记录每次访问的新记录。在那里存储时间戳,article_id,IP地址和其他数据。 这背后的基本原理是,您不必为每次访问锁定每篇文章的数据库记录,这可能会导致锁定问题/争用。

现在,当您有兴趣检索视图数时,请在日志表上进行简单的选择。对于应该“足够好”的中型网站;随着负载的增加,您必须定期计算每篇文章的视图数量,并缓存视图计数器以加快对此数据的访问。