Java實現統計在線人數功能的方法詳解

1. 監聽器的簡介

監聽器就是一個實現特定接口的普通java程序,這個程序專門用於監聽另一個java對象的方法調用或屬性改變,當被監聽對象發生上述事件後,監聽器某個方法將立即被執行。

2. Java監聽器的類型

(1)ServletContextListener

用於監聽WEB,應用啟動和銷毀的事件

public void contextInitialized(ServletContextEvent sce):在初始化web應用時執行

 public void contextDestroyed(ServletContextEvent sce) {}:在銷毀web應用時執行

(2)HttpSessionListener

用於監聽Session對象的創建和銷毀

public void sessionCreated(HttpSessionEvent se) {}:session創建的時候執行

public void sessionDestroyed(HttpSessionEvent se) {}: session被銷毀的時候執行

(3)ServletRequestListener

用於監聽Requset對象的創建和銷毀

public void requsetCreated(HttpSessionEvent se) {}:requset創建的時候執行

public void requestDestroyed(HttpSessionEvent se) {}: requset被銷毀的時候執行

(4)ServletContextAttributeListener

用於監聽WEB作用域屬性的改動,包括:增加屬性、刪除屬性、修改屬性

attributeAdded(ServletContextEvent sce):向ServletContext中添加屬性時執行

attributeAdded(ServletContextRemoved sce):ServletContext中刪除屬性時執行

attributeReplaced(ServletContextRemoved sce):ServletContext中修改屬性時執行

(5)HttpSessionAttributeListener

用於監聽Session作用域屬性的改動,包括:增加屬性、刪除屬性、修改屬性

(6)ServletRequestAttributeListener

用於監聽Requset作用域屬性的改動,包括:增加屬性、刪除屬性、修改屬性 

(7)HttpSessionActivationListener

用於監聽某個對象在Session中的序列化和反序列化

3.監聽器Listener實現統計人數功能 

(1)先創建監聽器包listener在新建OnlineListener類

package listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionBindingEvent;
 
@WebListener()
public class OnlineListener implements ServletContextListener,HttpSessionListener, HttpSessionAttributeListener {

    private static int count=0;
 
    public OnlineListener() {//構造函數
    }
 
    // ServletContextListener的實現方法,在初始化web應用時執行,你可以在此處初始化server上下文相關數據
    public void contextInitialized(ServletContextEvent sce) {//應用初始化完成
   
    }
   
    // ServletContextListener的實現方法,在web應用關閉時執行
    public void contextDestroyed(ServletContextEvent sce) {
     
    }
 
    // HttpSessionListener的實現方法,session被創建的時候執行
    public void sessionCreated(HttpSessionEvent se) {//創建
        count++;
        ServletContext app = se.getSession().getServletContext();
        app.setAttribute("count",count);
    }


   // HttpSessionListener的實現方法,session被銷毀的時候執行
    public void sessionDestroyed(HttpSessionEvent se) {
        count--;
        ServletContext app = se.getSession().getServletContext();
        app.setAttribute("count",count);
    }
}

(2)創建監聽器servlet的接口

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
 
@WebServlet(name = "OnlineServlet",urlPatterns = "/online")
public class OnlineServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     this.doGet(request, response);
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      String op=request.getParameter("op");
      String result="";
      switch (op){
          case "login":
              //request.getSession()觸發監聽器的sessionCreated
              ServletContext app=request.getSession().getServletContext();
              int count= (int) app.getAttribute("count");
              result=String.format("當前%d人在線",count);
              break;
          case "logout":
              //銷毀session,觸發監聽器的sessionDestroy
              request.getSession().invalidate();//銷毀session
              result="您已經退出瞭!";
      }
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out=response.getWriter();
        out.write(result);
        out.close();
    }
}

4.Redis實現統計人數功能 

需求:平均訪問時常,平均同時在線人數,最高同時在線人數

(1)先設計數據表:

開始訪問頁面時間,離開頁面時間表:(id,place,ip,user_id,user_name, begin_time, end_time, env, info,len_min)

統計表:平均訪問時常,平均同時在線人數,最高同時在線人數(id,day,age_len_visit_min, acu, pcu)

統計記錄表:每分鐘的同時在線人數。 (id,min_time, num)

(2)使用redis存儲當前在線用戶,每次調用可以看作瀏覽瞭一分鐘(根據業務可以再細化,隻需要定時任務記錄上次一分鐘和當前一分鐘的用戶,即可算出,某一個用戶在某個頁面的訪問時常。

(3)同時記錄用戶開始訪問頁面時間,離開頁面時間,即可分析出後續。

(4)為方便數據處理,可以記錄每個頁面每分鐘的訪問量。

(5)redis, 存儲2個hash:

begin,定時器存儲到的hash集合,記錄詳細信息

now,接口傳遞過來的用戶訪問集合,記錄刷新時間

通過定時器來進行更新,刷新操作。

ps: hash中單獨的key不可以自動設置過期,或者使用redis監聽,使用String類型的key,監聽是過濾,匹配到自己需要處理的再進行處理即可。

以上就是Java實現統計在線人數功能的方法詳解的詳細內容,更多關於Java統計在線人數的資料請關註WalkonNet其它相關文章!

推薦閱讀: