最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)統(tǒng)計(jì)在線人數(shù)功能的方法詳解

 更新時(shí)間:2022年08月30日 15:57:02   作者:十八歲討厭Java  
很多人在筆試或者面試中問到:現(xiàn)在要你實(shí)現(xiàn)一個(gè)統(tǒng)計(jì)在線人數(shù)的功能,你該怎么設(shè)計(jì)?不知道的朋友,這篇文章就來告訴你具體實(shí)現(xiàn)方法

1. 監(jiān)聽器的簡介

監(jiān)聽器就是一個(gè)實(shí)現(xiàn)特定接口的普通java程序,這個(gè)程序?qū)iT用于監(jiān)聽另一個(gè)java對象的方法調(diào)用或?qū)傩愿淖?,?dāng)被監(jiān)聽對象發(fā)生上述事件后,監(jiān)聽器某個(gè)方法將立即被執(zhí)行。

2. Java監(jiān)聽器的類型

(1)ServletContextListener

用于監(jiān)聽WEB,應(yīng)用啟動(dòng)和銷毀的事件

public void contextInitialized(ServletContextEvent sce):在初始化web應(yīng)用時(shí)執(zhí)行

 public void contextDestroyed(ServletContextEvent sce) {}:在銷毀web應(yīng)用時(shí)執(zhí)行

(2)HttpSessionListener

用于監(jiān)聽Session對象的創(chuàng)建和銷毀

public void sessionCreated(HttpSessionEvent se) {}:session創(chuàng)建的時(shí)候執(zhí)行

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

(3)ServletRequestListener

用于監(jiān)聽Requset對象的創(chuàng)建和銷毀

public void requsetCreated(HttpSessionEvent se) {}:requset創(chuàng)建的時(shí)候執(zhí)行

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

(4)ServletContextAttributeListener

用于監(jiān)聽WEB作用域?qū)傩缘母膭?dòng),包括:增加屬性、刪除屬性、修改屬性

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

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

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

(5)HttpSessionAttributeListener

用于監(jiān)聽Session作用域?qū)傩缘母膭?dòng),包括:增加屬性、刪除屬性、修改屬性

(6)ServletRequestAttributeListener

用于監(jiān)聽Requset作用域?qū)傩缘母膭?dòng),包括:增加屬性、刪除屬性、修改屬性 

(7)HttpSessionActivationListener

用于監(jiān)聽某個(gè)對象在Session中的序列化和反序列化

3.監(jiān)聽器Listener實(shí)現(xiàn)統(tǒng)計(jì)人數(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的實(shí)現(xiàn)方法,在初始化web應(yīng)用時(shí)執(zhí)行,你可以在此處初始化server上下文相關(guān)數(shù)據(jù)
? ? public void contextInitialized(ServletContextEvent sce) {//應(yīng)用初始化完成
? ?
? ? }
? ?
? ? // ServletContextListener的實(shí)現(xiàn)方法,在web應(yīng)用關(guān)閉時(shí)執(zhí)行
? ? public void contextDestroyed(ServletContextEvent sce) {
? ? ?
? ? }
?
? ? // HttpSessionListener的實(shí)現(xiàn)方法,session被創(chuàng)建的時(shí)候執(zhí)行
? ? public void sessionCreated(HttpSessionEvent se) {//創(chuàng)建
? ? ? ? count++;
? ? ? ? ServletContext app = se.getSession().getServletContext();
? ? ? ? app.setAttribute("count",count);
? ? }


? ?// HttpSessionListener的實(shí)現(xiàn)方法,session被銷毀的時(shí)候執(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āng)前%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實(shí)現(xiàn)統(tǒng)計(jì)人數(shù)功能 

需求:平均訪問時(shí)常,平均同時(shí)在線人數(shù),最高同時(shí)在線人數(shù)

(1)先設(shè)計(jì)數(shù)據(jù)表:

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

統(tǒng)計(jì)表:平均訪問時(shí)常,平均同時(shí)在線人數(shù),最高同時(shí)在線人數(shù)(id,day,age_len_visit_min, acu, pcu)

統(tǒng)計(jì)記錄表:每分鐘的同時(shí)在線人數(shù)。 (id,min_time, num)

(2)使用redis存儲(chǔ)當(dāng)前在線用戶,每次調(diào)用可以看作瀏覽了一分鐘(根據(jù)業(yè)務(wù)可以再細(xì)化,只需要定時(shí)任務(wù)記錄上次一分鐘和當(dāng)前一分鐘的用戶,即可算出,某一個(gè)用戶在某個(gè)頁面的訪問時(shí)常。

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

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

(5)redis, 存儲(chǔ)2個(gè)hash:

begin,定時(shí)器存儲(chǔ)到的hash集合,記錄詳細(xì)信息

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

通過定時(shí)器來進(jìn)行更新,刷新操作。

ps: hash中單獨(dú)的key不可以自動(dòng)設(shè)置過期,或者使用redis監(jiān)聽,使用String類型的key,監(jiān)聽是過濾,匹配到自己需要處理的再進(jìn)行處理即可。

以上就是Java實(shí)現(xiàn)統(tǒng)計(jì)在線人數(shù)功能的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Java統(tǒng)計(jì)在線人數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于Java變量的聲明、內(nèi)存分配及初始化詳解

    關(guān)于Java變量的聲明、內(nèi)存分配及初始化詳解

    下面小編就為大家?guī)硪黄P(guān)于Java變量的聲明、內(nèi)存分配及初始化詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • Mybatis打印SQL語句的幾種常用方式

    Mybatis打印SQL語句的幾種常用方式

    當(dāng)我們動(dòng)態(tài)sql拼接的塊很多的時(shí)候,我們要想從*mapper.xml中直接找出完整的sql就會(huì)非常的難,這個(gè)時(shí)候經(jīng)常會(huì)需要把組合之后的完整SQL語句打印出來,對調(diào)試非常有幫助的,所以本文小編給大家介紹了幾種Mybatis打印SQL語句的常用方式,需要的朋友可以參考下
    2023-11-11
  • java必學(xué)必會(huì)之GUI編程

    java必學(xué)必會(huì)之GUI編程

    這篇文章主要為大家詳細(xì)介紹了java GUI編程,對于GUI編程小編也不是很了解,通過這篇文章和大家一起學(xué)習(xí)GUI編程,感興趣的小伙伴們可以參考一下
    2015-12-12
  • Java語言十大基礎(chǔ)特性分析

    Java語言十大基礎(chǔ)特性分析

    這篇文章介紹了Java語言十大基礎(chǔ)特性,它有哪些優(yōu)勢,需要的朋友可以參考下。
    2017-08-08
  • Java SQL注入案例教程及html基礎(chǔ)入門

    Java SQL注入案例教程及html基礎(chǔ)入門

    這篇文章主要介紹了前端開發(fā)每天必學(xué)之SQL及HTML入門基礎(chǔ)知識(shí),介紹了學(xué)習(xí)web前端開發(fā)需要掌握的基礎(chǔ)技術(shù),感興趣的小伙伴們可以參考一下
    2021-07-07
  • java poi實(shí)現(xiàn)Excel多級(jí)表頭導(dǎo)出方式(多級(jí)表頭,復(fù)雜表頭)

    java poi實(shí)現(xiàn)Excel多級(jí)表頭導(dǎo)出方式(多級(jí)表頭,復(fù)雜表頭)

    文章介紹了使用javapoi庫實(shí)現(xiàn)Excel多級(jí)表頭導(dǎo)出的方法,通過主代碼、合并單元格、設(shè)置表頭單元格寬度、填充數(shù)據(jù)、web下載和提供表頭樣式、內(nèi)容樣式以及標(biāo)題樣式等步驟,作者實(shí)現(xiàn)了最終的效果
    2025-01-01
  • Spring的UnsatisfiedDependencyException異常的解決

    Spring的UnsatisfiedDependencyException異常的解決

    在使用Spring框架開發(fā)應(yīng)用程序時(shí),我們經(jīng)常會(huì)遇到各種異常,本文主要介紹了Spring的UnsatisfiedDependencyException異常的解決,感興趣的可以了解一下
    2023-11-11
  • Spring整合Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)器的示例代碼

    Spring整合Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)器的示例代碼

    本篇文章主要介紹了Spring整合Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)器的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Java中求最大值的4種方法實(shí)例代碼

    Java中求最大值的4種方法實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Java中求最大值的4種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Mybatis防止sql注入原理分析

    Mybatis防止sql注入原理分析

    這篇文章主要介紹了Mybatis防止sql注入原理分析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論

湟中县| 文成县| 永胜县| 河间市| 乐陵市| 周至县| 钟山县| 葵青区| 松江区| 遂川县| 镶黄旗| 科技| 隆尧县| 买车| 绥阳县| 虞城县| 五原县| 瑞丽市| 仲巴县| 宁德市| 永宁县| 银川市| 松江区| 澄江县| 赫章县| 晋城| 冕宁县| 鞍山市| 新津县| 新河县| 浮梁县| 文水县| 沈丘县| 铁岭县| 临沭县| 揭西县| 台湾省| 肇州县| 红安县| 镶黄旗| 阿鲁科尔沁旗|