标签:
首先我要说下我实现这个功能接口涉及到的业务和实现的详细流程,然后会说此接口涉及到的相关技术,最后会贴出注释后的详细代码, 这个接口涉及到的是 app上咻一咻功能,咻一咻中奖的奖品一共有七类,其中四类是兑换券的兑换额,另外三类是咻一咻提升中奖几率的功能券,前四类兑换券当玩家咻到之后就必须去访问数据库更新对应玩家兑换券额度,而且这频率是非常高的。就应为这点,所以我今天想了这个能够对接口进行减压的方法。
一、实现流程
首先数据库中有个单独的兑换券表,表的结构为:自增id=主键,用户的登录id=外建,4类券的值以一个json的格式的字符串存放到表中的一个字段中,那么现在该表一共就有3个字段(自增id,外建id,json格式的兑换券array),下面我截该表的图出来。
这些数据都是通过单例模式调用缓存中的数据进行更新或则插入的。下面我上流程图。
二、使用技术
单例模式、缓存、timer线程控制、数据处理使用JSONArray+JSONObject.
三、代码
1、servlet部分
1 package Servlet; 2 3 import java.io.IOException; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.util.Date; 7 import java.util.Timer; 8 import java.util.TimerTask; 9 import javax.servlet.ServletException; 10 import javax.servlet.annotation.WebServlet; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 import javax.servlet.http.HttpSession; 15 16 import org.json.JSONArray; 17 import org.json.JSONException; 18 import org.json.JSONObject; 19 20 import Helper.MySqlHepler; 21 import Helper.ResultToJsonTool; 22 import Helper.ShareSingleton; 23 24 @WebServlet("/GamesXiuXiuServlet") 25 public class GamesXiuXiuServlet extends HttpServlet { 26 27 private static final long serialVersionUID = 1L; 28 protected final String USER_AGENT = "Mozilla/5.0"; 29 public GamesXiuXiuServlet() { 30 super(); 31 // TODO Auto-generated constructor stub 32 } 33 34 @SuppressWarnings("null") 35 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 36 37 38 response.setContentType( "text/html"); 39 response.setCharacterEncoding("utf-8"); 40 request.setCharacterEncoding("utf-8"); 41 42 String token; 43 String account; 44 String[] mysqlParameter; 45 46 JSONObject returnJsonObject; //LoadType 47 48 String CheckToken=null; 49 ResultSet returnData; 50 String Type; 51 52 JSONArray returnJsonArray; 53 String ReplaceStr; 54 HttpSession session ; 55 JSONObject SessionSaveDic; 56 57 Type=request.getParameter("type"); 58 account=request.getParameter("account"); 59 60 token=request.getParameter("token"); 61 try { 62 CheckToken= ShareSingleton.getInstance().UsrTokenDictionary.getString(account); 63 64 } catch (JSONException e2) { 65 e2.printStackTrace(); 66 } 67 68 if(!token.equals(CheckToken)) 69 { 70 71 returnJsonObject =new JSONObject(); 72 73 try { 74 returnJsonObject.put("GetType", "4"); 75 returnJsonObject.put("Success", "0"); 76 returnJsonObject.put("Msg","token错误,请重新登录!"); 77 } catch (JSONException e) { 78 79 e.printStackTrace(); 80 } 81 82 83 response.getWriter().println(returnJsonObject.toString()); 84 85 return; 86 } 87 if(Type.equals("2")) //更新 88 { 89 90 ReplaceStr=request.getParameter("replaceJsonStr"); 91 session = request.getSession(); 92 SessionSaveDic=(JSONObject)session.getAttribute("allMemberDuiHuanKaListData"); 93 try { 94 /*先修改缓存,然后一个timer控件对数据库做间歇性的修改*/ 95 SessionSaveDic.put(account, ReplaceStr); 96 session.setAttribute("allMemberDuiHuanKaListData", SessionSaveDic); 97 //设置sessio 永不过期 98 ShareSingleton.getInstance().UpdateDuiHuanKaDictionary=SessionSaveDic; 99 session.setMaxInactiveInterval(-1); 100 101 } catch (JSONException e2) { 102 // TODO Auto-generated catch block 103 e2.printStackTrace(); 104 } 105 106 returnJsonObject =new JSONObject(); 107 try { 108 109 returnJsonObject.put("GetType", "3"); 110 returnJsonObject.put("Success", "1"); 111 returnJsonObject.put("Msg", "修改成功"); 112 113 } catch (JSONException e) { 114 115 e.printStackTrace(); 116 } 117 118 response.getWriter().println(returnJsonObject.toString()); 119 120 121 } 122 //查询出游戏表当前所有数据 123 else if(Type.equals("3")) 124 { 125 session = request.getSession(); 126 //这个值也会自动设置为空 由于咻咻玩的人比较多,所以将抵扣券的组合json放在内存中,然后使用时间间隔方式 更新数据库 127 SessionSaveDic=(JSONObject)session.getAttribute("allMemberDuiHuanKaListData"); 128 129 if (SessionSaveDic != null) { 130 131 String SinglePeopleJson=SessionSaveDic.optString(account); 132 if(SinglePeopleJson!="") 133 { 134 try { 135 String JsonListData= SessionSaveDic.getString(account); 136 137 returnJsonArray=new JSONArray(JsonListData) ; 138 returnJsonObject =new JSONObject(); 139 140 returnJsonObject.put("Rows", returnJsonArray); 141 returnJsonObject.put("GetType", "0"); 142 returnJsonObject.put("Success", "1"); 143 response.getWriter().println(returnJsonObject.toString()); 144 145 } catch (JSONException e1) { 146 // TODO Auto-generated catch block 147 e1.printStackTrace(); 148 } 149 150 151 } 152 else//下面就去数据库总查询 153 { 154 //如果缓存中没有就从数据库中取出来,然后再修改 155 mysqlParameter=new String[]{account}; 156 returnData=MySqlHepler.executeQueryT("select deductionCard from deductionCardSheet where account=?", mysqlParameter); 157 158 try { 159 returnJsonObject =new JSONObject(); 160 returnJsonArray=ResultToJsonTool.resultSetToJsonArry(returnData); 161 162 JSONObject tempObject=returnJsonArray.getJSONObject(0); 163 164 165 166 String JsonList = tempObject.getString("deductionCard"); 167 returnJsonArray=new JSONArray(JsonList) ; 168 169 returnJsonObject.put("Rows", returnJsonArray); 170 returnJsonObject.put("GetType", "0"); 171 returnJsonObject.put("Success", "1"); 172 173 SessionSaveDic.put(account, returnJsonArray); 174 175 session.setAttribute("allMemberDuiHuanKaListData", SessionSaveDic); 176 //设置sessio 永不过期 177 ShareSingleton.getInstance().UpdateDuiHuanKaDictionary=SessionSaveDic; 178 179 ShareSingleton.getInstance().KeysArray.put(account); 180 session.setMaxInactiveInterval(-1); 181 response.getWriter().println(returnJsonObject.toString()); 182 } catch (SQLException | JSONException e1) { 183 184 185 e1.printStackTrace(); 186 } 187 } 188 return; 189 } else{ 190 191 //如果缓存中没有就从数据库中取出来,然后再修改 192 mysqlParameter=new String[]{account}; 193 returnData=MySqlHepler.executeQueryT("select deductionCard from deductionCardSheet where account=?", mysqlParameter); 194 195 try { 196 returnJsonObject =new JSONObject(); 197 returnJsonArray=ResultToJsonTool.resultSetToJsonArry(returnData); 198 JSONObject tempObject=returnJsonArray.getJSONObject(0); 199 String JsonList = tempObject.getString("deductionCard"); 200 returnJsonArray=new JSONArray(JsonList) ; 201 202 returnJsonObject.put("Rows", returnJsonArray); 203 returnJsonObject.put("GetType", "0"); 204 returnJsonObject.put("Success", "1"); 205 SessionSaveDic=new JSONObject(); 206 SessionSaveDic.put(account, returnJsonArray); 207 session.setAttribute("allMemberDuiHuanKaListData", SessionSaveDic); 208 //设置sessio 永不过期 209 ShareSingleton.getInstance().UpdateDuiHuanKaDictionary=SessionSaveDic; 210 211 synchronized(this) { 212 //一次只能有一个线程进入 213 ShareSingleton.getInstance().KeysArray.put(account); 214 ShareSingleton.getInstance().TastIsOrNoRun=1; 215 } 216 session.setMaxInactiveInterval(-1); 217 response.getWriter().println(returnJsonObject.toString()); 218 } catch (SQLException | JSONException e1) { 219 220 221 e1.printStackTrace(); 222 } 223 224 } 225 } 226 227 228 } 229 230 231 232 233 234 }
2、单例模式部分
1 package Helper; 2 import java.util.Date; 3 4 import java.util.Timer; 5 import java.util.TimerTask; 6 7 import org.json.JSONArray; 8 import org.json.JSONException; 9 import org.json.JSONObject; 10 public class ShareSingleton 11 { 12 public JSONObject UsrTokenDictionary; 13 public JSONObject UpdateDuiHuanKaDictionary; 14 public JSONArray KeysArray; 15 public static int updateIndex; 16 public int TastIsOrNoRun; 17 public static ShareSingleton instance=null; 18 19 public static ShareSingleton getInstance(){ 20 if(instance == null){ 21 instance = new ShareSingleton(); 22 instance.UsrTokenDictionary=new JSONObject(); 23 instance.UpdateDuiHuanKaDictionary=new JSONObject(); 24 instance.KeysArray=new JSONArray(); 25 return instance; 26 27 }else{ 28 29 if(instance.TastIsOrNoRun==1) 30 { 31 timerTask(); 32 instance.TastIsOrNoRun=10; 33 } 34 else 35 { 36 37 } 38 return instance; 39 } 40 } 41 42 public static void timerTask() { 43 44 new Timer().schedule(new TimerTask(){ 45 @Override 46 public void run() { 47 48 JSONObject TempDictionaryX=instance.UpdateDuiHuanKaDictionary; 49 JSONArray KeysArray=instance.KeysArray; 50 try { 51 // JSONObject TempDictionaryX= TempDictionary; //TempDictionary.getJSONObject("allMemberDuiHuanKaListData"); 52 if( updateIndex== KeysArray.length()-1) 53 { 54 //这里已经有key了,可以去修改数据库了,我这里设置的10秒钟修改一条数据 55 String UpdateKey=(String) KeysArray.get(updateIndex); 56 57 String UpdateJson= TempDictionaryX.getString(UpdateKey); 58 //这个updatekey就是user的登录id也就是字典的取值id 59 String[] mysqlParameter=new String[]{ UpdateJson,UpdateKey}; 60 //更新游戏 61 //这里要访问两次数据库,第一次修改user表第二次修改游戏表 62 // update userSheet set userIntegral=userIntegral-1,userTotalIntegral=userTotalIntegral+10 where account= ‘13983918071‘; 63 64 MySqlHepler.executeUpdate("update deductionCardSheet set deductionCard=? where account=?",mysqlParameter); 65 updateIndex=0; 66 } 67 else 68 { 69 70 //这里已经有key了,可以去修改数据库了,我这里设置的10秒钟修改一条数据 71 72 String UpdateKey= KeysArray.getString(updateIndex); 73 String UpdateJson= TempDictionaryX.getString(UpdateKey); 74 //这个updatekey就是user的登录id也就是字典的取值id 75 String[] mysqlParameter=new String[]{ UpdateJson,UpdateKey}; 76 //更新游戏 77 //这里要访问两次数据库,第一次修改user表第二次修改游戏表 78 // update userSheet set userIntegral=userIntegral-1,userTotalIntegral=userTotalIntegral+10 where account= ‘13983918071‘; 79 80 MySqlHepler.executeUpdate("update deductionCardSheet set deductionCard=? where account=?",mysqlParameter); 81 82 updateIndex++; 83 84 85 } 86 87 } catch (JSONException e) { 88 89 e.printStackTrace(); 90 } 91 92 } 93 },new Date(),20000); 94 } 95 }
四、总结
用户所有对数据的操作都在缓存中进行,通过单例模式里的timer控制缓存中的数据去更新数据库上的数据。
Servlet 服务器性能提高--->数据库请求频率控制(原创)
标签:
原文地址:http://www.cnblogs.com/xiaoliao/p/5933288.html