1

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

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

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

这种方法正确吗?

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

4

2 回答 2

2

这种方法适用于中等负载的站点,但最终您会遇到锁定问题。

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

离线进程将读取队列并适当地更新列。这将允许一个进程随时访问该特定列。

于 2010-11-21T22:48:03.833 回答
2

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

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

于 2010-11-22T17:43:08.347 回答