Web并发页面访问量统计实现

页面访问量统计,可能在上学的时候就讲过如何简单实现,例如在servletContext中保存一个页页面访问次数,然后每访问一次加1;或者每访问一次就把操作记录保存到数据库,这样的处理方式,做做实验就算了,在实际应用中这样应用对系统性能影响特别大。

第一种方式,因为页面访问次数属于一个公共变量,在对公共变量进行修改的时候,往往需要加上同步锁;同步锁会导致访问速度明显变慢;第二种方式也一样,而且频繁访问数据库也不是一种合理的方式。

前不久,我一个朋友要我帮他们写一个简单的页面统计代码。1、需求是保存页面访问IP、时间、以及其他一些可用的信息,以后需要保存的访问信息可扩展 2、不能影响当前的访问速度 3、能支持一定量的并发访问

接到朋友给的这个需求,我想到了一下几点:1、如何筛选我们需要统计的页面;2、需要将访问和统计分离,不在访问的线程中来保存访问信息,另外起一个线程将访问信息保存到数据库;3、可以使用一个公共的队列来保存这个访问信息;4、可以批量的保存一定量的访问信息
  

解决方案:

1、针对第一个问题,我给出了两个方法。1、使用一个集合保存所有的需要统计的页面,然后再在Filter里面判断当前请求是否在在统计之列;2、在JSP页面中引入一段公共代码,在代码中使用类似这种CounterUtils.addCounter(request);这种方法有一个好处,维护需要统计的页面比较方便,而且感觉上更加高效,不需要Filter拦截。但是朋友坚决用第一种方式,也是没有办法。

2、每访问一次,我们将需要保存的信息保存成一个对象,然后放入到队列当中,然后另起一个线程定期进行保存。

于是我就写了一个简单的demo给朋友,没过多久,就被退货了。经过测试并发还没到200就突然不保存数据库了,访问也变得特慢,最后竟然堆内存溢出了。

没有办法只能再在本机用loadRunner进行测试,同时通过jconsole java自带工具来检测内存变化情况。测试情况与朋友说的一样,刚开始能够正常运行,当并发达到一定量,就开始出现保存缓慢,最后不知道怎么整的保存线程不再运行,就这样队列越来越大,自然堆内存大到溢出了。


从上面的情况也可以想到,一个队列有可能无法支持这么大的并发访问,于是就想使用多个队列来进行保存,使用类似分表分库的方法,将不同请求分配到不同的队列中去,于是就变成了下面这种方式:


部分代码如下:(尾部有相关源码获取方式)
1、初始化生成linkedList集合列表

将请求封装成统计所需对象

3、轮询LinkedList队列集合

4、ExecuteThread线程用于批量保存访问日志

  // 批量保存数据库

这个分两种方式

1、保存详细的访问记录,例如,某某时候某个IP对某个页面进行了访问

2、只保存某天每个页面访问的总数

  对于第一种方式,使用批量保存即可。对于第二种方式可以使用一个hashTable来维护所有页面某个时间段内的对应页面的访问增量,具体维护方式可以如下:

  将reqestStc信息维护进HashTable当中,其中维护过程省略;再写一个定时器,定时将HashTable中的增量数据flush到数据库中;

5、如何拦截需要统计的访问请求
方法一:通过判断uri是否在需要统计之列
方法二:在需要统计的jsp中添加JAVA代码例如:CounterUtils.addCounter(request);

方法三:JS异步访问,类似百度统计的这种方式,这种方式有个好处,就是不影响页面加载速度。

经过修改,在loadRunner和tomcat的测试下,基本上能够达到tomcat最大的并发以上用户,并且占用少量资源。

还有一种方式就是百度统计那种方式,在js端使用异步统计代码,这样做的好处是不影响页面的加载速度,代码如下图,具体实现没有去深究:

(转:http://blog.csdn.net/wushuchu/article/details/52036753)

公众号回复"page"获取相关源码

Web并发页面访问量统计实现相关推荐

  1. java统计多个线程的请求次数_Web并发页面访问量统计实现

    页面访问量统计,可能在上学的时候就讲过如何简单实现,例如在servletContext中保存一个页页面访问次数,然后每访问一次加1:或者每访问一次就把操作记录保存到数据库,这样的处理方式,做做实验就算 ...

  2. CH13,拍42,练习一。通过文本文件统计页面访问量

    index.php <?php error_reporting(E_ALL ^E_NOTICE); session_start(); //SESSION的目的就是防止访问后刷新,这样访问量不更新 ...

  3. ASP.NET中网站访问量统计方法

    一.建立一个数据表IPStat用于存放用户信息 我在IPStat表中存放的用户信息只包括登录用户的IP(IP_Address),IP来源(IP_Src)和登录时间(IP_DateTime),些表的信息 ...

  4. 在线人数统计和总访问量统计

    1.新建网站,添加几个窗体.webForm1.aspx ,ViewStateForm.aspx 2.在网站的根目录下添加全局应用程序类"Global.aspx" .(重要) 3.在 ...

  5. 十四个方法提高博客的页面访问量

    如何增加Blog的访问量已经是老生长谈了,其实对于blogger来说另一个统计数也至关重要:页面浏览量. 很多的网站流量统计服务会同时提供这两项数据- "访问量"计数的是访问者的数 ...

  6. 大聪明教你学Java | Spring Boot 整合 Redis 实现访问量统计

    前言 之前开发系统的时候客户提到了一个需求:需要统计某些页面的访问量,记得当时还纠结了一阵子,不知道怎么去实现这个功能,后来还是在大佬的带领下借助 Redis 实现了这个功能.今天又回想起了这件事,正 ...

  7. web前端页面性能优化SEO优化

    首先什么叫网站? 网站一般分为前端和后台.我们可以理解成后台是用来实现网站的功能的,比如:实现用户注册,用户能够为文章发表评论等等.而前端应该是属于功能的表现.并且影响用户访问体验的绝大部分来自前端页 ...

  8. hexo教程:搜索SEO+阅读量统计+访问量统计+评论系统

    hexo教程:搜索SEO+阅读量统计+访问量统计+评论系统 更多精彩内容欢迎访问我的个人博客皮皮猪:http://www.zhsh666.xyz或者http://www.zh66.club期待您的光临 ...

  9. Github pages Hexo博客访问量统计功能的实现

    之前使用Hexo搭建了自己的github.io博客https://littlefogcat.github.io/.但是没有访问统计功能,让人头大.于是决定着手整一个. 首先需要有一台自己的服务器,如果 ...

  10. python 图表_Python入门学习系列——使用Python调用Web API实现图表统计

    使用Python调用Web API实现图表统计 Web API:Web应用编程接口,用于URL请求特定信息的程序交互,请求的数据大多以非常易于处理的格式返回,比如JSON或CSV等. 本文将使用Pyt ...

最新文章

  1. Tomcat服务器端口的配置
  2. pyqt tableview mysql_当数据库中添加了一个新条目时,如何在PyQt中更新TableView?
  3. 【转】C# 中Linq查询所有上级节点或所有下级节点
  4. 重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源
  5. php mysql主从延迟_如何解决主从数据库同步延迟问题?php连接 mysql 数据库如何添加一个公共的配置文件50...
  6. 阿里云云原生一体化数仓正式发布 助力企业数据驱动业务创新
  7. 一条语句复制整个目录《转》
  8. Delphi2CS破解 Delphi 转换C#
  9. 软件逆向工具常用快捷键
  10. 服务器里那个文件是地图的爆率,dnf这才是固伤职业最喜欢的地图,气息爆率是巨龙的4倍!...
  11. php strpos 区分大小写么?,PHP strpos() 函数
  12. VMware 虚拟机 linux执行 ifconfig 命令 eth0没有IP地址(intet addr、Bcast、Mask) UP BROADCAST MULTICAST 问题
  13. [LeetCode-java实现]3. 无重复字符的最长子串
  14. 线性表示线性相关线性无关
  15. total command关闭按钮如何修改为最小化
  16. keil延时c语言程序设计,Keil C51程序设计中几种精确延时方法
  17. 海底捞管理方法的调研报告
  18. 普通的html页面中ie11的兼容性问题
  19. Python实现简单画图
  20. 装linux时电脑蓝屏如何解决,笔记本电脑开机蓝屏 怎么用u盘安装ubuntu

热门文章

  1. 有限差分法求解高阶导数
  2. 陈小龙书pHP,PHP
  3. Spring 最常用的几大类常用注解总结,史上最强整理!
  4. 宝藏级别的负数取模,让你关于负数取模不在陌生 >o< 进来看看吧
  5. 什么是网易企业邮箱客户端专有协议?
  6. 计算机网络共享打不开,电脑只要打开共享提示“无法启用共享访问”如何解决...
  7. 安卓工具类集合—— 1 时间、时间戳转换工具
  8. CVPR 2019 | SPADE 阅读笔记(翻译)
  9. 事业单位招聘计算机岗位考试题,计算机考试题库:计算机考试练习题(136)
  10. C++ Concurrency in Action 2nd Edition