zoukankan      html  css  js  c++  java
  • 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多万,各种当前热门的网络手机奖励红包全部集成,另外还有热门电影和淘宝高额优惠券!很适合各类型的用户。

     

  • 相关阅读:
    HDFS datanode源码分析
    hive udaf开发入门和运行过程详解
    hive原生和复合类型的数据加载和使用
    tomcat部署web应用(转)
    HDFS namenode源码分析
    HDFS dfsclient写文件过程 源码分析
    hive中UDTF编写和使用(转)
    HDFS dfsclient读文件过程 源码分析
    MapReduce源码分析总结(转)
    DataRabbit 轻量的数据访问框架(09) -- IDataSchemaAccesser
  • 原文地址:https://www.cnblogs.com/xiaoliao/p/5927536.html
Copyright © 2011-2022 走看看