亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

并發頁面訪問量統計簡單實現

2019-11-14 23:32:01
字體:
來源:轉載
供稿:網友
并發頁面訪問量統計簡單實現

  頁面訪問量統計,可能在上學的時候就講過如何簡單實現,例如在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集合列表

    /**     * 根據urls生成隊列數組     * @return     */    PRivate static LinkedList<RequestStc>[] initUris() {        Digester digester = new Digester();        String path = null;        try {            path = CounterUtils.class.getClassLoader().getResource("urls.xml").toURI().getPath();        } catch (URISyntaxException e1) {            e1.printStackTrace();        }                UriRuleSet ruleSet = new UriRuleSet();        ruleSet.addRuleInstances(digester);        try {            // uri集合            uris = digester.parse(new File(path));            // hashCode基數            BaseHash = uris!=null?uris.size()/3:1;                        LinkedList<RequestStc>[] listArr = new LinkedList[BaseHash];                        for(int i=0; i<listArr.length; i++)                listArr[i] = new LinkedList<RequestStc>();            return listArr;        } catch (Exception e) {            e.printStackTrace();            return null;        }    }

2、將請求封裝成統計所需對象

    /**     * 添加一次請求統計     * @param request     */    public static void addCounter(HttpServletRequest request) {                // 封裝用戶統計的request,并且用hash算法分布到不同的隊列當中        RequestStc stc = new RequestStc();        stc.setIp(request.getRemoteAddr());        stc.setUri(request.getRequestURI());        stc.setNow(Calendar.getInstance().getTime());        buffers[request.hashCode()%BaseHash].push(stc);    }

3、輪詢LinkedList隊列集合

    /**     * 執行統計     */    private void processCount() {        try {            // 輪詢隊列            while(true) {                Thread.sleep(Sleep_MS);                if(buffers==null) {                    break;                }                                Thread th = null;                for(int i=0,len = buffers.length; i<len; i++) {                    LinkedList<RequestStc> stcList = null;                    if(buffers[i].size()>=Execute_Base) {                        // 復制buffers數組元素,然后清空,啟動一個線程對隊列進行保存                        synchronized (buffers[i]) {                            stcList = (LinkedList<RequestStc>) buffers[i].clone();                            buffers[i].clear();                        }                        th = new Thread(new ExecuteThread(stcList));                        th.start();                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }            }        

4、ExecuteThread線程用于批量保存訪問日志

  // 批量保存數據庫

這個分兩種方式1、保存詳細的訪問記錄,例如,某某時候某個IP對某個頁面進行了訪問 2、只保存某天每個頁面訪問的總數

  對于第一種方式,使用批量保存即可。對于第二種方式可以使用一個hashTable來維護所有頁面某個時間段內的對應頁面的訪問增量,具體維護方式可以如下:

  將reqestStc信息維護進HashTable當中,其中維護過程省略;再寫一個定時器,定時將HashTable中的增量數據flush到數據庫中;

  

  /**     * 將數據刷出,保存到數據庫     */    public void flush() {        Hashtable<String, RequestParam> saveTable = null;     // 這個地方為什么不用同步鎖,因為HashTable本身就是線程安全的,clone方法上加了同步鎖        saveTable = (Hashtable) counterTables.clone();        counterTables.clear();                if(saveTable.isEmpty())            return;                for(Entry<String, RequestParam> ent:saveTable.entrySet()) {            String url = ent.getKey();            RequestParam param = ent.getValue();            System.out.println("url:" + url);            System.out.println("pv:" + param.getPv());            requestCount += param.getPv();        }        System.out.println("ip:" + ips.size());        System.out.println("訪問總數為:" + requestCount);    }

5、如何攔截需要統計的訪問請求 方法一:通過判斷uri是否在需要統計之列 方法二:在需要統計的jsp中添加JAVA代碼例如:CounterUtils.addCounter(request);

方法三:JS異步訪問,類似百度統計的這種方式,這種方式有個好處,就是不影響頁面加載速度

經過修改,在loadRunner和tomcat的測試下,基本上能夠達到tomcat最大的并發以上用戶,并且占用少量資源。

還有一種方式就是百度統計那種方式,在js端使用異步統計代碼,這樣做的好處是不影響頁面的加載速度,代碼如下圖,具體實現沒有去深究:

PS:以上方法純屬個人解決方案,如有不妥,請不吝指教!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
高跟丝袜欧美一区| 国模精品一区二区三区色天香| 国内精品久久影院| 亚洲国产日韩欧美在线99| 日本亚洲精品在线观看| 久久久在线免费观看| 久久久久久有精品国产| 久久视频在线看| 久久久久久久久网站| 亚州欧美日韩中文视频| 日韩av一区在线观看| 超碰精品一区二区三区乱码| 亚洲综合自拍一区| 亚洲欧美成人精品| 欧美成人在线影院| 国产亚洲福利一区| 亚洲精品www久久久久久广东| 在线观看日韩专区| 国产97在线视频| 日本久久久久久| 国产一区二区三区在线观看网站| 欧美精品久久久久久久久久| 亚洲人成欧美中文字幕| 亚洲国产日韩欧美在线99| 欧美日韩精品在线观看| 成人免费看片视频| 日本伊人精品一区二区三区介绍| 国产视频综合在线| 国产欧美精品一区二区| 成人免费视频a| 在线国产精品视频| 91在线观看欧美日韩| 亚洲精品国产成人| 亚洲国产99精品国自产| 中文字幕精品—区二区| 久久伊人精品天天| 91视频8mav| 欧美黄色小视频| 国模精品视频一区二区| 精品福利樱桃av导航| 久久久精品999| 国产精品亚洲视频在线观看| 欧美在线观看网站| 精品国产自在精品国产浪潮| 久久久久久久香蕉网| 欧美激情在线播放| 久久久亚洲国产| 亚洲精品乱码久久久久久金桔影视| 久久人人爽亚洲精品天堂| 欧美国产精品日韩| 国产精品欧美风情| 中文字幕亚洲图片| 欧美精品999| 欧美视频在线免费| 亚洲欧洲在线看| 国产精品久久久999| 欧美日韩中文字幕在线| 色www亚洲国产张柏芝| 日本亚洲欧美成人| 最新中文字幕亚洲| 色播久久人人爽人人爽人人片视av| 久久亚洲电影天堂| 中文字幕自拍vr一区二区三区| 亚洲一区二区在线播放| 精品久久久av| 久久精品99久久久久久久久| 国产精品成av人在线视午夜片| 免费av一区二区| 性色av一区二区三区在线观看| 国产在线a不卡| 亚洲国产私拍精品国模在线观看| 欧美大片网站在线观看| 国产精品网红直播| 一区二区三区四区精品| 亚洲xxxx视频| 欧美激情videoshd| 久久久成人精品| 欧美一级视频在线观看| 日韩精品免费电影| 精品无人区乱码1区2区3区在线| 成人女保姆的销魂服务| 色噜噜国产精品视频一区二区| 亚洲欧美另类人妖| 7777免费精品视频| 欧美国产日本高清在线| 奇米一区二区三区四区久久| 亚洲а∨天堂久久精品喷水| 日韩www在线| 国产一区二区三区在线视频| 国产精品激情av在线播放| 亚洲精品456在线播放狼人| 青青草国产精品一区二区| 国产一区二区丝袜| 久久免费精品视频| 日韩电影免费观看在线| 成人精品网站在线观看| 综合网日日天干夜夜久久| 国产成人综合精品在线| 一区二区三区视频观看| 久久亚洲综合国产精品99麻豆精品福利| 亚洲有声小说3d| 欧美亚洲在线播放| 国产欧美一区二区| 亚洲精品在线观看www| 69久久夜色精品国产69乱青草| 欧美成在线观看| 在线观看国产精品日韩av| 亚洲天堂精品在线| 国产高清视频一区三区| 欧美日韩国产丝袜另类| 亚洲成人精品视频| 美女性感视频久久久| 夜夜躁日日躁狠狠久久88av| 欧美性生交xxxxxdddd| 色综合久久精品亚洲国产| 欧美大尺度在线观看| 日韩综合视频在线观看| 亚洲欧洲午夜一线一品| 国产日产欧美a一级在线| 国产福利成人在线| 97碰在线观看| 日韩极品精品视频免费观看| 成人做爽爽免费视频| 7777kkkk成人观看| 成人免费黄色网| 久久久精品免费| 国产精品亚发布| 68精品久久久久久欧美| 韩日欧美一区二区| 国产精品v日韩精品| 国产精品电影在线观看| 国产中文字幕日韩| 一区二区三区在线播放欧美| 国产这里只有精品| 亚洲国产一区二区三区在线观看| 午夜免费日韩视频| 久久视频中文字幕| 日本欧美黄网站| 国产狼人综合免费视频| 欧美激情精品久久久久久| 国产欧美日韩免费看aⅴ视频| 国产精品美乳一区二区免费| 日韩在线播放一区| 91欧美视频网站| 国产一区二区日韩精品欧美精品| 成人日韩在线电影| 亚洲精品动漫久久久久| 亚洲自拍欧美色图| 国产精品最新在线观看| 热久久视久久精品18亚洲精品| 欧美激情按摩在线| 国产香蕉97碰碰久久人人| 一区二区三区黄色| 亚洲国产精品va在线观看黑人| 色黄久久久久久| 4444欧美成人kkkk| 亚洲自拍偷拍第一页| 国内精久久久久久久久久人| 尤物99国产成人精品视频| 国产成人中文字幕| 中文在线资源观看视频网站免费不卡| 亚洲小视频在线观看| 国产精品一二三视频| 欧美高清理论片|