亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

查詢數據過多頁面反應慢引入緩存解決方案(Redis、H2)

2019-11-14 21:50:58
字體:
來源:轉載
供稿:網友
查詢數據過多頁面反應慢引入緩存解決方案(Redis、H2)問題:原系統查詢接口不支持分頁也不可能加入分頁支持,導致Ajax查詢數據過多,返回數據達到2W多條記錄時響應已經極慢,查詢功能不要求數據實時性,頁面反應速度極慢、體驗不好;經排查是由于數據量過大導致寫回頁面的時候慢,實現是直接Servlet輸出流寫到頁面上(output.write(buffer, 0, b));需求變更:加快頁面相應速度,頁面要有分頁功能,可以改變原接口在這種情況下有兩種解決方案: 1、前端js分頁 2、加入第三方緩存部件(內存數據庫等)兩種解決方案的缺點: 第一種方案的問題,雖然解決了分頁問題但由于查詢的數據量比較大,查詢返回頁面的數據達幾萬條有幾兆甚至十多兆數據頁面反應還是過慢,如果在前端使用js進行分頁那查詢反應過慢的問題還是沒法決解,頁面負擔過重體驗還是差; 第二種方案問題,相對來說會比第一種復雜點,編碼量會增多,如是處理實時查詢較為復雜但也不是不可以,要考慮清理緩存數據已保證數據的有效性。 經過權衡利弊,決定拋棄第一種方案,決定引入內存數據庫已解決問題。內存數據庫現在也有不少種類選擇如:redis、H2、HSQLDB等等,在這三個內存數據中redis和其他兩個還是不一樣的,redis是C語言實現的輕量的基于key-value的nosql數據庫,而H2與HSQLDB都是用java實現的輕量關系型數據庫;所以我想在nosql數據庫和關系型數據庫中各選一個,實現此功能最終看性能如何決定使用哪個。 H2相比HSQLDB有web操作界面,H2比HSQLDB更新也比較頻繁,所以這里選擇H2與redis。 一、redis緩存數據實現分頁功能。 redis實現不太友好的地方,由于redis是C語言實現的所以redis無法實現嵌入Java代碼中啟動redis服務器(我沒找到方案),需要另外啟 動redis服務器,為了實現分頁還需要再啟動redis視乎有點過了; 思路:使用redis的zset(Sorted-Sets)有序集和數據類型來存儲數據,SeeesionID+數據類型當作key,score為接口查詢來的順序,value為拼裝好的單條json數據,可以根據session失效或設置redis key的失效時間來清除數據。實現代碼如下: /** * 處理分頁,查出數據填充到redis,然后再從redis中分頁查詢,每次查詢都覆蓋redis中數據 * @param rtList * @param callback * @param response * @throws IOException * @linx * @Date 2014-11-10 */public void PRocessPager(List<CSTRTData> rtList, String callback,HttpServletRequest request, HttpServletResponse response,String top,String skip) throws IOException { Jedis jedis = new Jedis("127.0.0.1"); OutputStream output = null; Set<String> setValues=new HashSet<String>(); String dataList = ""; String keyName=request.getSession().getId()+"troubleCode"; if(top==null){ top="1"; } if(skip==null){ skip="0"; } if (rtList.size() > 0) { for (int x = 0; x < rtList.size(); x++) { JSONObject temp = JSONObject.fromObject(rtList.get(x)); long recvTime = temp.getLong("recvTime"); long obdTime = temp.getLong("obdTime"); temp.remove("recvTime"); temp.put("recvTime", DateUtil.formatYYYYMMDDHHMMSS(recvTime)); temp.remove("obdTime"); temp.put("obdTime", DateUtil.formatYYYYMMDDHHMMSS(obdTime)); jedis.zadd(keyName, x, temp.toString()); } int start=Integer.valueOf(skip); //開始行號,第一頁開始行號為0, 第二頁起為上一頁skip+頁大小 int end = Integer.valueOf(top)+Integer.valueOf(skip)-1; //結束行號 top=頁大小, 結束行號=skip+top-1 //根據start、end 序號從小到大 從redis中讀取出數據 setValues = jedis.zrange(keyName, start, end); // Set<String> setValues2 = jedis.zrevrange("hackers", 0, -1); //遍歷拼裝json for (Iterator iter = setValues.iterator(); iter.hasNext();) { if (iter.hasNext()) { dataList += (String) iter.next() + ","; } else { dataList += (String) iter.next(); } } }else{ jedis.del(keyName); } //拼裝頁面最終需要的json串 dataList = callback + "({" + "/"d/" : {" + "/"results/" : [" + dataList + "]," + "/"__count/" : /"" + rtList.size() + "/"" + "}" + "})";// 轉成輸入流 InputStream input = new ByteArrayInputStream(dataList.getBytes()); output = response.getOutputStream(); int b = 0; byte[] buffer = new byte[1024];//通過輸出流寫到頁面 while ((b = input.read(buffer)) != -1) { output.write(buffer, 0, b); output.flush(); } if (output != null) output.close(); if (input != null) input.close();} 二、H2緩存數據實現分頁功能。 H2有個好處就是可以嵌入在Java代碼中啟動H2數據庫,由于它也是關系型數據庫所以使用起來和我們常用的數據庫沒有什么區別,使用它的內存模式,你不用擔心他的性能問題。 思路:在H2中添加張表,然后把每條數據都轉成JSON,然后按順序存入添加的表中,就可以使用我們經常使用的分頁Sql語句進行查詢,每天點第一頁的時候都調用原接口把數據重新覆蓋到H2的表中??梢愿鶕ession失效清除表數據。實現代碼如下:public class H2Opertion { public static void createTable(Connection conn) throws Exception { Statement stmt = conn.createStatement(); stmt.executeUpdate("CREATE TABLE temp(ID INT PRIMARY KEY,NAME VARCHAR(2000));"); } public static Connection open() throws Exception { Class.forName("org.h2.Driver"); Connection conn = DriverManager.getConnection("jdbc:h2:./h2db/demo","sa", ""); return conn; } public static void insertData(Connection conn, List<String> list) throws Exception { Statement stmt = conn.createStatement(); for (int i = 0; i < list.size(); i++) { stmt.executeUpdate("INSERT INTO temp VALUES(" + i + ", '" + list.get(i) + "');"); } } public static List query(Connection conn,int start,int end) throws Exception { Statement stmt = conn.createStatement();//分頁查詢 ResultSet rs = stmt .executeQuery("select t2.* from (select rownum r,t1.* from temp t1 where rownum<="+end+") t2 where t2.r>"+start); while (rs.next()) { System.out.println(rs.getInt("ID") + "," + rs.getString("NAME")); } return null; }public static void deleteTable(Connection conn) throws Exception { Statement stmt = conn.createStatement(); stmt.executeUpdate("delete temp");}public static void main(String[] args) { H2Server server = new H2Server(); server.startServer(); Connection conn = null; try { conn = H2Opertion.open(); try { H2Opertion.createTable(conn); //創建表 } catch (Exception e) { e.printStackTrace(); H2Opertion.log.error("表存在", e); } H2Opertion.log.info("刪除表數據"); H2Opertion.deleteTable(conn); //刪除表數據 //模擬接口查詢出來的數據 List<String> listData = new ArrayList<String>(); for (int i = 0; i < 30; i++) { listData.add("content" + i); } //把數據插入到H2的表中 H2Opertion.insertData(conn, listData);

//分頁查詢H2表中的數據,10-20條數據

H2Opertion.query(conn,10,20); } catch (Exception e) { H2Opertion.log.error(e); } finally { try { conn.close(); } catch (SQLException e) { H2Opertion.log.error(e); } } }}

文章首發地址:Solinx

http://www.solinx.co/archives/67


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久影院日本| 色av中文字幕一区| 中文字幕日韩视频| 最近2019中文字幕在线高清| 日韩在线免费视频| 欧美精品少妇videofree| 最近2019年日本中文免费字幕| 欧美又大又粗又长| 国产精品日本精品| 国产精品一区av| 亚洲变态欧美另类捆绑| 国产一区二区三区视频在线观看| 亚洲va电影大全| 国产精品视频专区| 亚洲性夜色噜噜噜7777| 亚洲一区亚洲二区| 欧美美最猛性xxxxxx| 日韩av一卡二卡| 亚洲开心激情网| 日本久久久a级免费| 亚洲三级av在线| 国产成人精品久久二区二区| 亚洲成人aaa| 欧美在线视频在线播放完整版免费观看| 亚洲精品资源美女情侣酒店| 日韩视频―中文字幕| 国产精品久久久久久婷婷天堂| 国产999精品久久久| 97精品伊人久久久大香线蕉| 欧美性猛交99久久久久99按摩| 久久综合免费视频影院| 国产欧美精品在线播放| 国产伦精品一区二区三区精品视频| 琪琪亚洲精品午夜在线| 韩国欧美亚洲国产| 日韩精品在线观看视频| 中文字幕av一区中文字幕天堂| 国产亚洲欧美aaaa| 久久九九有精品国产23| 亚洲欧美日韩中文在线| 亚洲欧洲av一区二区| 91中文字幕一区| 日韩国产高清污视频在线观看| 黄网动漫久久久| 久久资源免费视频| 亚洲free性xxxx护士hd| 欧美一级在线播放| 日本欧美黄网站| 欧美精品福利在线| 久久久精品久久久| 日韩国产激情在线| 欧洲永久精品大片ww免费漫画| 亚洲一区亚洲二区| 久久亚洲精品一区二区| 91av中文字幕| 国产亚洲一区二区精品| 国产精品视频免费在线观看| 久久亚洲国产精品成人av秋霞| 国产亚洲精品综合一区91| 亚洲偷熟乱区亚洲香蕉av| 九九热最新视频//这里只有精品| 亚洲人成网站777色婷婷| 亚洲一区二区三区香蕉| 一区二区三欧美| 国产综合久久久久| 亚洲黄色有码视频| 精品成人av一区| 北条麻妃一区二区三区中文字幕| 亚洲最大福利视频| 亚洲电影免费观看高清完整版| 欧美三级欧美成人高清www| 欧美日韩一区二区免费在线观看| 中文字幕在线看视频国产欧美在线看完整| 国产精品爽爽ⅴa在线观看| 亚洲在线观看视频网站| 亚洲tv在线观看| 久久精品视频免费播放| 欧美日韩国产在线看| 亚洲人成网站色ww在线| 欧美情侣性视频| 亚洲人成网站999久久久综合| 国产精品成人一区| 欧美激情精品久久久| 久久久女女女女999久久| 一区二区日韩精品| 日韩精品中文字幕在线观看| 日韩精品丝袜在线| 日韩中文字幕不卡视频| xxx一区二区| 777777777亚洲妇女| 亚洲自拍高清视频网站| 高清欧美电影在线| 欧美成人第一页| 日本久久亚洲电影| 国产精品丝袜久久久久久不卡| 精品日韩视频在线观看| 亚洲欧美www| 日韩免费观看视频| 日韩av网址在线| 日韩日本欧美亚洲| 欧美超级免费视 在线| 欧美午夜精品久久久久久浪潮| 欧美性高跟鞋xxxxhd| 亚洲字幕在线观看| 日本精品视频在线| 亚洲r级在线观看| 九九热99久久久国产盗摄| 欧美激情2020午夜免费观看| 亚洲乱码国产乱码精品精| 日韩电影第一页| 亚洲伊人一本大道中文字幕| 日本国产精品视频| 亚洲一区二区三区乱码aⅴ| 国产成人午夜视频网址| 久久久久久有精品国产| 亚洲图片欧洲图片av| 最近2019好看的中文字幕免费| 亚洲精品自拍视频| 成人乱色短篇合集| 亚洲精品美女视频| 中文字幕亚洲专区| 国产噜噜噜噜噜久久久久久久久| 91精品国产色综合| 欧美第一黄色网| 日韩视频―中文字幕| 精品毛片网大全| 777国产偷窥盗摄精品视频| 国产日韩精品在线播放| 蜜臀久久99精品久久久久久宅男| 欧美—级高清免费播放| 国产精品av电影| 亚洲成人黄色网址| 欧美激情精品久久久久久免费印度| 久久国产精品99国产精| 久久免费精品日本久久中文字幕| 国产精品国产三级国产专播精品人| 成人免费看黄网站| 精品久久香蕉国产线看观看亚洲| 国产香蕉97碰碰久久人人| 亚洲四色影视在线观看| 国外日韩电影在线观看| 91成人在线观看国产| 精品中文字幕在线观看| 久久精品91久久久久久再现| 国产精品久久一区| 成人黄色免费看| 久久精品国产一区| 精品久久久久久电影| 亚洲自拍高清视频网站| 亚洲品质视频自拍网| 久久99国产精品自在自在app| 国产精品日韩欧美综合| 亚洲第一福利在线观看| 国产美女久久精品香蕉69| 高潮白浆女日韩av免费看| 性色av一区二区三区红粉影视| 国产成人综合久久| 川上优av一区二区线观看| 国产亚洲欧洲高清| 午夜精品久久久久久99热| 亚洲自拍av在线| 亚洲精品动漫久久久久| 在线观看不卡av| 欧美一级视频在线观看|