Servlet数据缓存
Posted 日魂月魄
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于Servlet数据缓存的主要内容,如果未能解决你的问题,请参考以下文章