Java實現(xiàn)統(tǒng)計在線人數(shù)功能的方法詳解
1. 監(jiān)聽器的簡介
監(jiān)聽器就是一個實現(xiàn)特定接口的普通java程序,這個程序?qū)iT用于監(jiān)聽另一個java對象的方法調(diào)用或?qū)傩愿淖?,當被監(jiān)聽對象發(fā)生上述事件后,監(jiān)聽器某個方法將立即被執(zhí)行。
2. Java監(jiān)聽器的類型
(1)ServletContextListener
用于監(jiān)聽WEB,應用啟動和銷毀的事件
public void contextInitialized(ServletContextEvent sce):在初始化web應用時執(zhí)行
public void contextDestroyed(ServletContextEvent sce) {}:在銷毀web應用時執(zhí)行
(2)HttpSessionListener
用于監(jiān)聽Session對象的創(chuàng)建和銷毀
public void sessionCreated(HttpSessionEvent se) {}:session創(chuàng)建的時候執(zhí)行
public void sessionDestroyed(HttpSessionEvent se) {}: session被銷毀的時候執(zhí)行
(3)ServletRequestListener
用于監(jiān)聽Requset對象的創(chuàng)建和銷毀
public void requsetCreated(HttpSessionEvent se) {}:requset創(chuàng)建的時候執(zhí)行
public void requestDestroyed(HttpSessionEvent se) {}: requset被銷毀的時候執(zhí)行
(4)ServletContextAttributeListener
用于監(jiān)聽WEB作用域?qū)傩缘母膭?,包括:增加屬性、刪除屬性、修改屬性
attributeAdded(ServletContextEvent sce):向ServletContext中添加屬性時執(zhí)行
attributeAdded(ServletContextRemoved sce):ServletContext中刪除屬性時執(zhí)行
attributeReplaced(ServletContextRemoved sce):ServletContext中修改屬性時執(zhí)行
(5)HttpSessionAttributeListener
用于監(jiān)聽Session作用域?qū)傩缘母膭?,包括:增加屬性、刪除屬性、修改屬性
(6)ServletRequestAttributeListener
用于監(jiān)聽Requset作用域?qū)傩缘母膭樱ǎ涸黾訉傩?、刪除屬性、修改屬性
(7)HttpSessionActivationListener
用于監(jiān)聽某個對象在Session中的序列化和反序列化
3.監(jiān)聽器Listener實現(xiàn)統(tǒng)計人數(shù)功能
(1)先創(chuàng)建監(jiān)聽器包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() {//構(gòu)造函數(shù) ? ? } ? ? ? // ServletContextListener的實現(xiàn)方法,在初始化web應用時執(zhí)行,你可以在此處初始化server上下文相關(guān)數(shù)據(jù) ? ? public void contextInitialized(ServletContextEvent sce) {//應用初始化完成 ? ? ? ? } ? ? ? ? // ServletContextListener的實現(xiàn)方法,在web應用關(guān)閉時執(zhí)行 ? ? public void contextDestroyed(ServletContextEvent sce) { ? ? ? ? ? } ? ? ? // HttpSessionListener的實現(xiàn)方法,session被創(chuàng)建的時候執(zhí)行 ? ? public void sessionCreated(HttpSessionEvent se) {//創(chuàng)建 ? ? ? ? count++; ? ? ? ? ServletContext app = se.getSession().getServletContext(); ? ? ? ? app.setAttribute("count",count); ? ? } ? ?// HttpSessionListener的實現(xiàn)方法,session被銷毀的時候執(zhí)行 ? ? public void sessionDestroyed(HttpSessionEvent se) { ? ? ? ? count--; ? ? ? ? ServletContext app = se.getSession().getServletContext(); ? ? ? ? app.setAttribute("count",count); ? ? } }
(2)創(chuàng)建監(jiān)聽器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()觸發(fā)監(jiān)聽器的sessionCreated ? ? ? ? ? ? ? ServletContext app=request.getSession().getServletContext(); ? ? ? ? ? ? ? int count= (int) app.getAttribute("count"); ? ? ? ? ? ? ? result=String.format("當前%d人在線",count); ? ? ? ? ? ? ? break; ? ? ? ? ? case "logout": ? ? ? ? ? ? ? //銷毀session,觸發(fā)監(jiān)聽器的sessionDestroy ? ? ? ? ? ? ? request.getSession().invalidate();//銷毀session ? ? ? ? ? ? ? result="您已經(jīng)退出了!"; ? ? ? } ? ? ? ? response.setContentType("text/html;charset=utf-8"); ? ? ? ? PrintWriter out=response.getWriter(); ? ? ? ? out.write(result); ? ? ? ? out.close(); ? ? } }
4.Redis實現(xiàn)統(tǒng)計人數(shù)功能
需求:平均訪問時常,平均同時在線人數(shù),最高同時在線人數(shù)
(1)先設(shè)計數(shù)據(jù)表:
開始訪問頁面時間,離開頁面時間表:(id,place,ip,user_id,user_name, begin_time, end_time, env, info,len_min)
統(tǒng)計表:平均訪問時常,平均同時在線人數(shù),最高同時在線人數(shù)(id,day,age_len_visit_min, acu, pcu)
統(tǒng)計記錄表:每分鐘的同時在線人數(shù)。 (id,min_time, num)
(2)使用redis存儲當前在線用戶,每次調(diào)用可以看作瀏覽了一分鐘(根據(jù)業(yè)務(wù)可以再細化,只需要定時任務(wù)記錄上次一分鐘和當前一分鐘的用戶,即可算出,某一個用戶在某個頁面的訪問時常。
(3)同時記錄用戶開始訪問頁面時間,離開頁面時間,即可分析出后續(xù)。
(4)為方便數(shù)據(jù)處理,可以記錄每個頁面每分鐘的訪問量。
(5)redis, 存儲2個hash:
begin,定時器存儲到的hash集合,記錄詳細信息
now,接口傳遞過來的用戶訪問集合,記錄刷新時間
通過定時器來進行更新,刷新操作。
ps: hash中單獨的key不可以自動設(shè)置過期,或者使用redis監(jiān)聽,使用String類型的key,監(jiān)聽是過濾,匹配到自己需要處理的再進行處理即可。
以上就是Java實現(xiàn)統(tǒng)計在線人數(shù)功能的方法詳解的詳細內(nèi)容,更多關(guān)于Java統(tǒng)計在線人數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中使用MyBatis-Plus操作數(shù)據(jù)庫的實例
本文主要介紹了Java中使用MyBatis-Plus操作數(shù)據(jù)庫的實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-02-02Java 實現(xiàn)分布式服務(wù)的調(diào)用鏈跟蹤
分布式服務(wù)中完成某一個業(yè)務(wù)動作,需要服務(wù)之間的相互協(xié)作才能完成,在這一次動作引起的多服務(wù)的聯(lián)動我們需要用1個唯一標識關(guān)聯(lián)起來,關(guān)聯(lián)起來就是調(diào)用鏈的跟蹤。本文介紹了Java 實現(xiàn)分布式服務(wù)的調(diào)用鏈跟蹤的步驟2021-06-06Java 將文件轉(zhuǎn)為字節(jié)數(shù)組知識總結(jié)及實例詳解
這篇文章主要介紹了Java 將文件轉(zhuǎn)為字節(jié)數(shù)組實例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12