23.3网站计数器

  • 通过io操作实现一个网站计数器,如果一个网站要记录从开站开始到今天的访问人数
  • 该技术有以下注意问题
  1. 该计数器必须在网站宕机之后可以将数据保存下来
  2. 考虑到计数器的访问量可能很大,所以不应该使用int类型,可以使用long或者Biginteger
  3. 如果要进行访问肯定是一个用户第一次打开才会开始计数
  4. 如果要进行数据的修改处理操作,那么一定会牵扯到一个同步的问题
  • 现在web项目的根目录处建立一个count.txt文件,这个文件描述的就是初期的访问量数,可以设置为0
image.png
  • 建立一个访问技术的程序文件:count_info.jsp
<%@ page pageEncoding="utf-8"%>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%
    request.setCharacterEncoding("utf-8");
    
%>
<%!
    //定义读取文件的名称
    public static final String COUNT_FILE = "/count.txt";
    //定义读取文件的方法
    public long read()throws Exception{
        long count = 0;
        File file = new File(this.getServletContext().getRealPath(COUNT_FILE));
        Scanner scanner = new Scanner(file);
        if(scanner.hasNext()){
            count = Long.parseLong(scanner.next());
        }
        scanner.close();
        return count;
    }
    //定义写入文件的方法
    //考虑到多个用户同时访问的问题,所以使用synchronized同步方法,以保证数据的准确性
    //考虑到网站的读取速度,在写入文件的同时返回读取文件的内容
    public long save()throws Exception{
        //先获取到原文件中的数据
        long orgCount = read();
        orgCount++;
        PrintStream ps = new PrintStream(new File(this.getServletContext().getRealPath(COUNT_FILE)));
        ps.print(orgCount);
        //一定要关闭文件流
        ps.close();
        return orgCount;
    }
%>
<%
    long count = 0;
    //判断本次是否是一个新的用户访问,或者是新的一个页面访问
    if(session.isNew()){
        //如果是一个新的用户则进行计数更新
        count = save();
    }else{
        //如果不是新用户,则得到原有的访问数
        count = read();
    }
%>

<%=count%>

  • 以上的程序却是考虑到了同步问题,但是过多的同步会导致页面浏览数速度变慢,所以在实际开发会使用更高级的技术完成网站计数器的功能

你可能感兴趣的:(23.3网站计数器)