Servlet數據緩存


 

本人開發的開發者技術變現資源聚集地,大家支持下,下面是網址

https://www.baiydu.com

 

緩存是提高數據訪問能力,降低服務器壓力的一種必要的方式,今天我要說的數據緩存方式有兩種,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                 }

  

 

本人創業做的一款androidApp, 下載量已經有2000多萬,各種當前熱門的網絡手機獎勵紅包全部集成,另外還有熱門電影和淘寶高額優惠券!很適合各類型的用戶。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM