StackOverFlow上的页面视图计数器

时间:2008-10-29 14:06:49

标签: asp.net

实现网页浏览计数器的最佳方式是什么,就像他们在网站上的每个问题都有“视图”计数器一样?

考虑性能和可伸缩性问题。

7 个答案:

答案 0 :(得分:11)

我在stackoverflow视图计数器上做了两个观察:

  • 标题中有一个link元素,用于处理触发计数更新。对于这个问题,标记看起来像这样:
    <link href="/questions/246919/increment-view-count" type="text/css" rel="stylesheet" />
    我想你可以点击那个网址来更新viewcount而不用实际查看页面,但我还没有尝试过。

  • 我有一个uservoice ticket,其中Jeff的回复表明视图不是连续两次从同一个ip增加。

答案 1 :(得分:8)

我优化的计数器的工作原理如下:

UPDATE page_views SET counter = counter + 1 WHERE page_id = x
if (affected_rows == 0 ) {
   INSERT INTO page_views (page_id, counter) VALUES (x, 1)
}

这样您可以对第一个视图运行2个查询,其他视图只需要1个查询。

答案 2 :(得分:6)

有效的方法可能是: 将您的计数器存储在Application对象中,您可以定期将其保存到文件/ DB,并在应用程序关闭时保留。

答案 3 :(得分:4)

我不会在每次数据库被调用时都进行数据库调用,而是使用缓存对象增加计数器,并且根据每天访问您网站的访问次数,每隔100次命中就会将页面命中数发送到数据库网站。这比在每次点击时更新数据库更快。

或者另一个解决方案是分析IIS日志文件并通过Windows服务每30分钟更新一次点击。这就是我所实施的,它可以创造奇迹。

答案 4 :(得分:0)

您可以实现IHttpHandler来实现这一目标。

答案 5 :(得分:0)

我是@Guillaume的实施风格的粉丝。我使用透明的GIF处理程序和内存中的队列批处理更改集,然后使用global.asax中创建的单独线程定期刷新。

处理程序实现IHttpHandler,处理请求参数,例如页面ID,语言等,更新队列,然后响应。写入透明的GIF。

通过将持久性更改移动到单独的线程而非用户请求,您还可以更好地处理运行多个服务器等的潜在序列化问题。

当然你也可以付钱给别人去做这项工作,例如用透明的GIF。

答案 6 :(得分:0)

对我来说,最好的方法是在问题表中添加一个字段,并在访问问题时更新它

UPDATE Questions SET views = views + 1 WHERE QuestionID = x

应用程序对象:IMO不具有可扩展性,因为随着访问的问题越多,可能会因大量内存消耗而结束 Page_views表:不需要,你必须在

之后进行昂贵的加入