实现网页浏览计数器的最佳方式是什么,就像他们在网站上的每个问题都有“视图”计数器一样?
考虑性能和可伸缩性问题。
答案 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表:不需要,你必须在
之后进行昂贵的加入