我正在创建一个点击计数器,用于跟踪访问特定页面的人数。保存此信息的表包含page_id,ip_address和timestamp(当IP地址访问页面时)。
我遇到的“问题”是保存此信息的最佳方式。如果我每次用户访问页面时都存储它,它会影响网站性能以及保存过程中可能出现的问题。我希望可能使用Application_End
文件中的Global.asax
来添加计数器表中的记录。但是我怎么能保存这些记录呢?我是否使用Application
变量?如果是,怎么样?
答案 0 :(得分:5)
which is the best way to save this information
有三种方法可以帮助不影响显示页面的性能,并且只关心您要保存哪些数据并保持自己的方式。
您可以使用从页面调用的处理程序作为图像,仅用于编写此统计计数器。在此处理程序中,您不使用会话,因此您甚至不会阻止其他页面。而且大多数蜘蛛都没有调用它,所以你只写真正的用户。
您可以通过以下方式将呼叫置于页面上:
<img src="keepstats.ashx?Page=CurrentPage.aspx" height="1" width="1" alt="" >
并且处理程序是
// 1x1 transparent GIF
private readonly byte[] GifData = {
0x47, 0x49, 0x46, 0x38, 0x39, 0x61,
0x01, 0x00, 0x01, 0x00, 0x80, 0xff,
0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
0x00, 0x2c, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x01, 0x00, 0x00, 0x02,
0x02, 0x44, 0x01, 0x00, 0x3b
};
public void ProcessRequest (HttpContext context)
{
// save here your stat counter
// send the image
context.Response.ContentType = "image/gif";
context.Response.Buffer = false;
context.Response.OutputStream.Write(GifData, 0, GifData.Length);
}
不要从代码后面调用此函数,而是从页面内部调用此函数。这种情况的解除是会话锁定页面,页面必须完全加载以允许下一个请求继续。但是最容易制作。
<body>
... all the page here...
..bottom of the page..
<%
// you send this part of the page and user all ready see it
Response.Flush();
// now you call the function that calculate the statistics
// the page still show that is loading, but the user all ready see it
CallTheStatisticSaveFunction();
%>
</body>
我忘记了另一种方法,创建一个线程,使页面中的工作并行且不可靠。
在我的代码中,我使用了上述所有技巧,一个用于统计,第二个用于必须在页面上执行但可能需要更多时间的操作。我使用该线程进行必须在开始渲染页面之前完成的操作,并使用一些技巧,如果线程没有结束,我将渲染我的内容。
我将避免会话以了解用户是否已准备就绪,因为这个原因:
当你关闭iis或停止你的应用程序时,Application_End
只被调用。全局并且每次都调用的点是Application_BeginRequest
,但是你会影响性能,因为每个asp.net元素都会调用它,你需要检查它是否是一个页面,如果是其他东西,那么页面的第一点,你会有延迟。我们在这里搜索如何在用户看到内容后最后编写统计信息。
答案 1 :(得分:0)
你有几种选择;您可以使用Session
对象来存储匹配,以便当同一用户(IP地址)访问同一页面时,它不会再次保存。
重要的是要记住,如果你在一个服务器上运行,这个选项是相关的(当然有一个网络农场的解决方案 - 但我不认为它是你的情况和它在这里详细说明可能是错误的)并且没有太多的独立访问者,因为会话将很快填满你的可用内存。
还有其他选项,例如使用Redis - 但首先,对于负载不是很高的网站,使用Session
过滤重复点击是正常的。