程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Servlet數據緩存,servlet緩存

Servlet數據緩存,servlet緩存

編輯:JAVA綜合教程

Servlet數據緩存,servlet緩存


 緩存是提高數據訪問能力,降低服務器壓力的一種必要的方式,今天我要說的數據緩存方式有兩種,1-->session對單個數據訪問接口頁面的數據進行緩存,2-->單例模式對整個servlet頁面一個公用的數據緩存。 3-->cookie本地緩存

一、什麼是緩存

                  什麼是緩存,為了讓看者更好的理解,我這裡就用自己的理解來舉例說明,例如當前我們正在做一個商城類的app,app首頁要加載顯示很多商品,數據量比較大,像這樣的數據接口最適合給其加一個緩存了,因為這樣的數據接口反饋的數據都是公用的(所有人都是用它,不會根據不同用戶判斷,加載不同的數據) 。在我們沒有增加緩存之前,每當用戶在app上點擊對應的調用接口頁面之後,servlet都會去訪問數據庫,從數據庫中取得數據。但是當我們加了緩存後,只要有一個用戶訪問了這個接口數據庫之後,我們就會將這份數據保存到緩存中,那麼下次只要有用戶調用該接口,servlet就會從緩存中讀取保存的數據,然後反饋給用戶。

二、session

               session對點緩存,它保存的緩存,無法在其他頁面進行訪問,數據保存在服務器內存中,下面我來代碼。               

 1 //查詢出游戲表當前所有數據
 2         else if(Type.equals("3"))
 3         {
 4             
 5              
 6               HttpSession session = request.getSession(); 
 7               // 判斷session中 allGamesDataList的值是否為空,由於下面的代碼對session設置了過期時間,所以只要過期了,servlet
 8               //這個值也會自動設置為空
 9               if (session.getAttribute("allGamesDataList") != null) {  
10                   
11                   returnJsonObject=(JSONObject) session.getAttribute("allGamesDataList");
12                    response.getWriter().println(returnJsonObject.toString());
13                    return;
14               } else{  
15                   
16                   
17               
18               }
19          
20              mysqlParameter=new String[]{"account"};
23            returnData=MySqlHepler.executeQueryT("select __ from __ where __!=?", mysqlParameter);
24                       
25             try {
26                    returnJsonObject =new JSONObject();
27                    returnJsonArray=ResultToJsonTool.resultSetToJsonArry(returnData);
28                     returnJsonObject.put("Rows", returnJsonArray);
31                    returnJsonObject.put("GetType", "0");
32                    returnJsonObject.put("Success", "1");
33                     //緩存5分鐘過期,5分鐘內有人調用該接口,會直接從緩存中獲得數據,5分鐘後必須再訪問一次數據庫獲得數據並保存到緩存中
37                    session.setMaxInactiveInterval(5 * 60);
38                    session.setAttribute("allGamesDataList", returnJsonObject);
39                   response.getWriter().println(returnJsonObject.toString());
40                   
41             } catch (SQLException | JSONException e1) {
42                  
43                 
44                 e1.printStackTrace();
45             }
46             
47         }

二、單例模式

               這裡用單例來做緩存,是因為session保存的緩存無法跨頁訪問,所以就想到了單例,當然肯定還有其它更好的方法。我這裡使用單例保存的是用戶的token,當用戶登錄時生成的一個隨機token反饋給用戶,然後已用戶的登錄id為key,將toke保存在servlet的單例中, 這裡將token保存到緩存中,是因為token在所有的數據加密驗證頁面中都會使用到, 如果不保存那麼所有加密接口請求時都會去數據庫中查詢一次token,這樣肯定就影響效率了,遇到這樣的數據, 也必須做緩存的。

單例代碼

 1 package Helper;
 2 import org.json.JSONObject;
 3 public class ShareSingleton     
 4 {     
 5   public     JSONObject UsrTokenDictionary; 
 6   public   static ShareSingleton instance=null; 
 7   public static      ShareSingleton getInstance(){     
 8         if(instance == null){  
 9             instance = new ShareSingleton();  
10               instance.UsrTokenDictionary=new JSONObject();
11              return instance;
12             
13         }else{     
14             return instance;     
15         }     
16     }    
17    
18   public void VerifyTokenForInterface(String RequestToken)
19   {
20       
21      
22   }
23 }   

 

保存token到單例中

 1     //使用uuid生成用戶唯一token
 2                  ecryptToKenUUID = UUID.randomUUID().toString();
 3                   mysqlParameter=new String[]{ecryptToKenUUID,LoginId};
 4                 if(    MySqlHepler.executeUpdate("update  _ set _=?  where _=?", mysqlParameter)>0)
 5                 {
 6                      
 7                         UserInfoObject =array.getJSONObject(0);
 8                        UserInfoObject.put("encryptToken",ecryptToKenUUID);
 9                        /*AddicationDictionary:這裡的取值:為用戶需要保存到app defaultusr裡面的*/
10                        returnJsonObject.put("AddicationDictionary", UserInfoObject);
11                        returnJsonObject.put("GetType", "1");
12                        returnJsonObject.put("Success", "1");
13                        
14                         //再servlet返回操作結果前將 生成的token保存到單例模式中
15                        ShareSingleton.getInstance().UsrTokenDictionary.put(LoginId,ecryptToKenUUID);
16                        
17                        response.getWriter().println(returnJsonObject.toString());
18                 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved