1. 程式人生 > >Java中將請求資料存入本地快取

Java中將請求資料存入本地快取

最近做專案的時候,碰到這樣的需求,由於一些頁面的ajax請求資料太多,而且sql效率很低,導致壓力測試時一個頁面開啟需要一分多鐘,所以就想到如下幾種解決方案:
1.將請求的資料,通過IO寫入硬碟快取檔案,當發現有對應檔案時,便從該檔案讀取儲存的請求資料;
2.寫一個工具類,在工具類定義一個map型別的成員變數,將請求資料儲存到該map中;
3.修改資料庫伺服器的配置(當然這不是本文要討論的內容)
既然有了方案,就開始實現,頁面中有很多這樣的action:

@Action("test")
public void test(){
    writeJson(testService.getTestData());
}

基本都是通過service中的方法返回list(map(String,Object)) 型別的資料,然後通過writeJson返回json到前臺
方案一:

//請求快取資料方法
public void requestData(String requestName){
    try {
            //建立File物件,引數為String型別,表示目錄名
           File myFilePath = new File("D:\\cache");
           //先建立父路徑再建立檔案
           File myFile = new File("D:\\cache\\"
+requestName+".json"); //如果父路徑存在 if(myFilePath.exists()){ //如果檔案存在 if(myFile.exists()){ //檔案最後修改時間 Date date = new Date(myFile.lastModified()); //當前日期 Date today = new Date(); SimpleDateFormat sdf =new
SimpleDateFormat("yyyy-MM-dd"); String lastModifiedDateStr = sdf.format(date); String todayStr = sdf.format(today); //如果最後修改時間小於當前日期 if(lastModifiedDateStr.compareTo(todayStr)<0){ //將當前檔案刪除 myFile.delete(); //建立新的快取檔案 createFile(myFile,requestName); //如果最後修改時間大於或等於當前日期,則從該檔案讀取快取內容 }else{ // 讀取檔案內容 (輸入流) StringBuffer sb=new StringBuffer(); String tempstr=null; FileInputStream fis=new FileInputStream(myFile); BufferedReader br=new BufferedReader(new InputStreamReader(fis)); while((tempstr=br.readLine())!=null){ sb.append(tempstr); } Gson gson = new Gson(); //使用gson獲取檔案中儲存的List<Map<String, Object>>結構的資料 List<Map<String, Object>> list = gson.fromJson(sb.toString(), new TypeToken<List<Map<String, Object>>>(){}.getType()); writeJson(list); br.close(); fis.close(); } }else{ //建立新的快取檔案 createFile(myFile,requestName); } }else{ //建立目錄 myFilePath.mkdir(); //建立新的快取檔案 createFile(myFile,requestName); } } catch (Exception e) { e.printStackTrace(); } } //建立檔案方法 public void createFile(File file,String requestName){ try{ file.createNewFile(); //下面把資料寫入建立的檔案,首先新建檔名為引數建立FileWriter物件 FileWriter resultFile = new FileWriter(file); //把該物件包裝進PrinterWriter物件 PrintWriter myNewFile = new PrintWriter(resultFile); //使用反射獲取service中對應的方法 Method method = mHService.getClass().getDeclaredMethod(requestName, new Class[]{}); //動態執行該service的方法 Object result = method.invoke(this.mHService); //將資料寫到前臺 writeJson(result); //再通過PrinterWriter物件的println()方法把字串資料寫入新建檔案 myNewFile.println(JsonUtils.toJson(result)); myNewFile.close(); resultFile.close(); }catch(Exception e){ e.printStackTrace(); } }

方案一有很不好的地方,會產生快取檔案,讀寫受到硬碟讀寫速度限制等

方案二:

//首先在類中定義map成員儲存快取資料
public static Map<String,Object> cacheData = new HashMap<>();
//通過service和對應方法名來獲取快取資料
public static Object getCacheData(String methodName,Object service,Object... params){
    try{
        Method  method = service.getClass().getDeclaredMethod(methodName);
        String key = method.getName();
        Object[] objs = null;
        //獲取可變長引數
        if(params.length > 0){
             objs = new Object[params.length];
             int i = 0;
             for(Object p : params){
                 objs[i++] = p;
                 key += "_" + JsonUtils.toJson(p);
             }
        }
        //如果快取中有該請求的快取資料
        if(cacheData.containsKey(key)){
            System.out.println("read cache!");
            //獲取對應快取資料
            return cacheData.get(key);
        }else{
             Object result = null;
             try{
                 //有引數
                 if(objs != null){
                       //動態執行該方法,請求資料
                       result = method.invoke(service,objs);
                   }else{
                       //動態執行該方法,請求資料
                       result = method.invoke(service);
                   }
                 System.out.println("read db!");
                 //將請求的資料存入靜態成員,變成快取
                 cacheData.put(key, result);
             }catch(Exception e){
                 e.printStackTrace();
             }
             return result;
        }

    }catch(Exception e){
        return null;
    }
}

如有不妥和錯誤之處請各位評論指出。

相關推薦

Java中將請求資料存入本地快取

最近做專案的時候,碰到這樣的需求,由於一些頁面的ajax請求資料太多,而且sql效率很低,導致壓力測試時一個頁面開啟需要一分多鐘,所以就想到如下幾種解決方案: 1.將請求的資料,通過IO寫入硬碟快取檔案,當發現有對應檔案時,便從該檔案讀取儲存的請求資料;

Java 驗證請求資料完整性資訊

CreditAntifraudReq 請求接收實體類 package com.frms.exchange.command; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; im

java怎樣將資料儲存到快取中,之後再儲存

package com.henry; import java.util.HashMap; import java.util.Map; import java.util.Random; import ja

World Wind Java開發之八——載入本地快取檔案構建大範圍三維場景

/** * @Copyright 2014-2020 @奔跑的雞絲 **/ package edu.whu.vge.util; import edu.whu.vge.util.JavaCheckBoxTree.CheckBoxTreeNode; import gov.nasa.worldwind.Fa

【iOS】通過NSURLProtocol實現網頁載入本地快取資料

一.專案需求 專案中有個海報生成功能,使用UIWebView載入一些網頁,因為海報使用率比較高,有時載入網頁比較慢會影響使用者體驗,因此我們在APP啟動後,將一些固定資源,如css、圖片等,先快取到本地。載入網頁時,通過NSURLProtocol,優先使用本地的檔案,以加快網頁載入速

解決get請求java後臺接收資料亂碼問題

問題原因:從前端獲取引數出現了亂碼,通過debug可以看到xmmc為亂碼狀態。 解決辦法使用編碼解決 直接上程式碼  前端 使用encodeURICompomnent進行編碼 var xmmc = $('#s_xmmc').val(); xmmc=encodeURI

應用Java反射技術將Excel文件的資料存入對應MySQL資料庫

       最近在做專案的時候遇到這樣一個需求:客戶給了一堆Excel資料文件,是從系統中匯出的,我們需要按資料的格式建立資料庫,讀取這些文件,並存入資料庫。        資料庫採用MySQL,開發框架採用Spr

android快取框架ASimpleCache的使用 (網路請求資料快取

官方簡介: ASimpleCache 是一個為Android制定的 輕量級的 開源快取框架。輕量到只有一個java檔案(由十幾個類精簡而來)。 框架地址 1、它可以快取什麼東西? 普通的字串、JsonObject、JsonArray、Bitmap、Drawable、

Java ConcurrentHashmap實現Localcache本地快取

很多場景下,有些請求的資料,是不會經常改變的,這種時候,為了減少資料庫的查詢壓力,可以將這一部分資料放入快取中,直接從快取中讀取。除了一些像Redis等快取外,還可以通過本地記憶體,作為快取。下邊將使用ConcurrentHashMap來實現本地快取。 >相關的技術:

Java中將鍵盤輸入的一段字元存入char陣列中

import java.util.*; public class Test { public static void main(String[] args) { char[] a=new char[100]; String str; System.o

Android之SQLite本地快取資料

一、在android中資料本地儲存分為SQLite資料儲存,Sharedprferences資料的儲存,File儲存,ContentProvider、還有一種為網路(Network) 1、在這裡主要就說明SQLite資料的儲存, SQLite是輕量級嵌入式資料庫引擎,它支援

Java post請求傳送json資料在filter中解析方法

大家都知道Java的servlet分get和post請求方式,在servlet或者在集成了springMVC、Struts2的框架的情況下獲取請求的引數。那麼有時候我們需要在攔截其中獲取ServletRequest的引數就不那麼容易了。因為在ServletRequst中,如果是get請求我們可以通過reque

java中將資料匯出到Excel

  //main方法  package com.example.demo.system.entity; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java

Android請求獲取Java後端資料,登入介面例子

最近做了個Android請求獲取Java後端資料的例子,簡單實現了一下。先上個登入介面圖:   主要實現:java後端的程式碼 + Android的程式碼1、java後端(1)、先創個User類import net.sf.json.JSONObject; public cla

Android(或者Java)通過HttpUrlConnection向SpringMVC請求資料資料繫結)

問題描述     當我們使用SpringMVC作為服務端的框架時,有時不僅僅要應對web前端(jsp、javascript、Jquery等)的訪問請求,有時還可能需要響應Android和JavaSE(桌面應用)這些客戶端的請求,因此,除了web使用form表單

java中將各種型別資料轉化為json和從json中取資料

首先,匯入以下jar包 下面是各種型別轉化為json和從json中取出資料的程式 package jsontest; import java.util.ArrayList; import java.util.HashMap; import java.util.List;

java物件本地快取機制的實現

本地快取機制,利用java.util.concurrent,很好的管理本地記憶體儲存的物件內容。 建立屬性:  /**      * 具體內容存放的地方      */     private ConcurrentHashMap<String, Object>

Java自動過期本地快取簡單實現

實際專案中常常需要用到本地快取,特別是一些固定不變的資料,不想頻繁調介面,因為http請求本身需要耗時,下面幾個類對本地快取作了簡單實現,支援自動過期功能LocalCache.javainterface LocalCache { public void refresh()

java本地快取儲存cookieUtil工具類

import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.

python3中將資料存入Mysql資料庫

  近期自己練習爬取知乎評論資料,本來打算將資料存入ES,但是因為ES我之前也從來沒有接觸過,所以決定現將資料存入到Mysql資料庫中,網上有很多帖子,但是很多都是適用於python2.x版本,python3中沒有mysqldb,需要使用pymysql,使用如下語句來連結資料