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