在ASP.NET中实现命中计数器存储的最佳方法是什么?

在ASP.NET中实现命中计数器存储的最佳方法是什么?,asp.net,Asp.net,我正在创建一个点击计数器,用于跟踪有多少人访问了特定页面。保存此信息的表包含页面id、ip地址和时间戳(当ip地址访问页面时) 我面临的“问题”是,保存此信息的最佳方式是什么。如果每次用户访问页面时我都将其存储,则会影响网站性能,并且在保存过程中可能会出现问题。我希望可以使用Global.asax文件中的应用程序\u End将记录添加到计数器表中。但我如何保存这些记录呢?我是否使用应用程序变量?如果是,如何选择?您有几个选择;您可以使用Session对象来存储点击,以便当同一用户(IP地址)点击

我正在创建一个点击计数器,用于跟踪有多少人访问了特定页面。保存此信息的表包含页面id、ip地址和时间戳(当ip地址访问页面时)


我面临的“问题”是,保存此信息的最佳方式是什么。如果每次用户访问页面时我都将其存储,则会影响网站性能,并且在保存过程中可能会出现问题。我希望可以使用
Global.asax
文件中的
应用程序\u End
将记录添加到计数器表中。但我如何保存这些记录呢?我是否使用
应用程序
变量?如果是,如何选择?

您有几个选择;您可以使用
Session
对象来存储点击,以便当同一用户(IP地址)点击同一页面时,不会再次保存该页面

重要的是要记住,如果您在一台服务器上运行(当然有web场的解决方案,但我不认为这是您的情况,在这里详细说明它们可能是错误的),并且没有太多的唯一访问者,则此选项是相关的,因为会话将很快填满您的可用内存

还有其他的选择,比如使用Redis,但是对于一个负载不是很高的站点来说,使用
Session
过滤重复点击是可以的

which is the best way to save this information
有三种方法可以帮助您不影响页面的显示性能,并且只关心要保存和保留的数据

第一条路 您可以使用作为图像从页面调用的处理程序,只编写此统计计数器。在这个处理程序中,您不使用会话,因此您甚至不阻止其他页面。而且大多数spider都没有调用这个函数,所以您只编写真正的用户

您可以这样在页面上拨打电话:

<img src="keepstats.ashx?Page=CurrentPage.aspx" height="1" width="1" alt="" >
第二条路 不是从后面的代码调用这个函数,而是像这样从页面末尾的内部调用这个函数。这种情况的缺点是会话正在锁定页面,页面必须完全加载才能继续下一个请求。但这是最容易制作的

<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>

... 这里的所有页面。。。
…页面底部。。
第三条路 我忘了还有一种方法,创建一个线程,使页面上的工作并行且可靠

最后一句话 在我的代码中,我使用了上述所有技巧,一个用于统计,第二个用于必须在页面上完成但可能需要更多时间的操作。我使用线程执行在开始渲染页面之前必须完成的操作,并使用一些技巧,如果线程没有结束,我将渲染我拥有的内容

我将避免会话,以了解用户是否已准备好查看页面,原因如下:

  • 如果用户不使用cookie,则会话不工作,并且所有爬行器都不使用会话
  • 如果用户开始看到很多页面,会话数据就会增加

  • 当您关闭iis或停止应用程序时,
    应用程序\u End
    称为仅限一个。每次调用的全局点是
    应用程序_BeginRequest
    ,但这会影响性能,因为每个asp.net元素都会调用它,您需要检查它是否是一个页面,如果是其他内容,这在页面的第一个点,您将有延迟。我们在这里搜索如何在用户看到某些内容后在末尾写入统计信息。

    是否将统计信息保存到SQL Server数据库?其他数据库?或者,它只是存储在内存中,并在启动后删除?是的,它保存在SQL Server数据库中。你考虑过谷歌分析吗?可能没有足够的灵活性满足您的需要,但如果您还没有准备好,可能值得考虑您建议如何缓存统计数据?ie可能缓存命中数据并定期写入后端数据库?你对这方面的最佳实践有什么建议吗?ie使用应用程序变量或asp.net缓存对象?@gwynhowell你的问题对我来说太笼统了。另外,因为我使用多池和多线程系统,我必须为所有调用提供一个公共位置,这是数据库(而不是内存),所以我离开数据库来处理数据缓存——我只是对数据库进行了非常好和快速的调用。现在,在一次页面调用中,在调用周期中,我使用所有可能的位置来保存数据,直到周期结束,包括一些应用程序变量,但这不是您所要求的。有趣。我正在考虑如何应对类似的挑战。我的方法是在服务器上缓存stat数据,但可能我把事情复杂化了。我对你的评论“我让数据库处理数据缓存”很感兴趣-你对此有进一步的信息吗?Thanks@gwynhowell嗯,我可以告诉你,sql有很好的缓存,也可以保存统计数据,并且有很好的获取和保存数据的方法。还有一个很好的搜索数据的方法-整数和字符串。我做了一些真正的测试,sql总是更快。例如,如果在一个包含10000个数据的循环中搜索一个整数,sql会使用技巧在几个比较中找到它,并且不会运行所有数据来找到它。字典对数据进行类似的搜索。@gwynhowell我说最好看看如何加快与sql server的通信。例如,不要使用linq或任何其他使所有时间都能实时编译的dao。只读取并保存SQL上所需的数据。我还使用SQL Server缓存页面呈现的一部分,这是我浪费时间的地方。不管怎么说,这是一般性的,我认为每种情况都是不同的。查看此页面以查看它们是否是fast kappashop.gr我们使用300个表,每页上读取70-100个表。
    <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>