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