# 問題描述
? ? ?用戶線上查詢其上網(wǎng)流量詳單數(shù)據(jù)加載慢,且有時候數(shù)據(jù)沒有響應全~
? ? ?1、經(jīng)排除是調(diào)用第三方數(shù)據(jù)量達10w條響應會超時,數(shù)據(jù)沒正常返回
? ? ?2、現(xiàn)有線上緩存分頁也是加載慢數(shù)據(jù)不能正常展示
? ? ?3、第三方接口返回類似報文jsonj:
? ? ?
? ? 4、我們要返回頁面的報文json:
? ??
5、頁面最終類似截圖顯示結(jié)果:
# 解決方案:
>? ? 第1種方案:歷史遺留問題,第三方提供的接口是一次性返回數(shù)據(jù),沒考慮到用戶查詢一個月的數(shù)據(jù)量會超過幾萬條,所以我們作為調(diào)用方也只能通過redis緩存然后前端遞歸分頁加載所有數(shù)據(jù)展現(xiàn)~
> 代碼示例:
? ? ? ?第1種方案若第三方接口返回的數(shù)據(jù)量少,線上一直正常呈現(xiàn)給用戶數(shù)據(jù);某天某個用戶查詢數(shù)據(jù)上萬條返回然后問題暴露了,問題1、第三方接口超時失?。ㄔ鄄煌ㄟ^協(xié)同系統(tǒng)解決問題);2、前端在遞歸查詢緩存所有的數(shù)據(jù)加載慢用戶體驗非常差‘。
因為是線上問題,盡量避免前端修改最少化,只能通過后端接口來解決,通過原有業(yè)務流程及代碼的解讀,第三方接口最新版本也有兼容分頁調(diào)用,但是沒法同步分頁的,其分頁返回的數(shù)據(jù)達不到我們現(xiàn)有線上前端展示的結(jié)構(gòu)要求,要按日期yyyy-MM-dd分開分組,只能重構(gòu)優(yōu)化;
第2種方案:
文章來源:http://www.zghlxwxcb.cn/news/detail-709022.html
#相關(guān)工具類代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-709022.html
/** * 時間數(shù)組中取最大最小日期 * * @param dateArray 時間日期數(shù)據(jù):yyyy-MM-dd * @param flag 值為true 返回最大值,false返回最小值 * @return 2013-11-11 */ public static String showMaxOrMinDate(String[] dateArray, boolean flag) { Map<String, Integer> dateMap = new TreeMap<>(); int i, arrayLen; arrayLen = dateArray.length; for (i = 0; i < arrayLen; i++) { String dateKey = dateArray[i]; if (dateMap.containsKey(dateKey)) { int value = dateMap.get(dateKey) + 1; dateMap.put(dateKey, value); } else { dateMap.put(dateKey, 1); } } Set<String> keySet = dateMap.keySet(); String[] sorttedArray = new String[keySet.size()]; Iterator<String> iter = keySet.iterator(); int index = 0; while (iter.hasNext()) { String key = iter.next(); sorttedArray[index++] = key; } int sorttedArrayLen = sorttedArray.length; String dateStr = ""; if (flag) { dateStr = sorttedArray[sorttedArrayLen - 1]; } else { dateStr = sorttedArray[0]; } return dateStr; }
/** * @Author dxw * @Description //TODO 獲取傳入日期所在年的第一天 * @Date 19:19 2021/3/29 * @Param * @return */ public static Date getLastDayOfMonth(Date date) { final Calendar cal = Calendar.getInstance(); cal.setTime(date); final int last = cal.getActualMaximum(Calendar.DAY_OF_MONTH); cal.set(Calendar.DAY_OF_MONTH, last); return cal.getTime(); }
/** * 日期轉(zhuǎn)字符串 */ public static String date2String(Date date, String pattern) { if (date == null) { throw new IllegalArgumentException("timestamp null illegal"); } pattern = (pattern == null || pattern.equals("")) ? "yyyy-MM-dd": pattern; SimpleDateFormat sdf = new SimpleDateFormat(pattern); return sdf.format(date); }
/** * 比較兩個日期的月份是否一致 * * @param startDate 要比較日期 * @param endDate 比較日期 * @return */ public static boolean isSameMonth(String startDate, String endDate) { Date date1 = DateUtil.parse(startDate); Date date2 = DateUtil.parse(endDate); return DateUtil.isSameMonth(date1, date2); }
/** * 獲取兩個時間中間的日期(天) * * @param startDate "2022-01-09" * @param endDate "2022-01-12" * @return [2022-01-09, 2022-01-10, 2022-01-11, 2022-01-12] */ public static List<String> getBetweenDay(String startDate, String endDate) { Date start = null;// 定義起始日期 Date end = null;// 定義結(jié)束日期 try { start = new SimpleDateFormat("yyyy-MM-dd").parse(startDate); end = new SimpleDateFormat("yyyy-MM-dd").parse(endDate); } catch (ParseException e) { e.printStackTrace(); } List<String> result = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = start; Calendar cd = Calendar.getInstance();// 用Calendar 進行日期比較判斷 while (true) { assert date != null; assert end != null; if (!(date.getTime() <= end.getTime())) { break; } result.add(sdf.format(date)); cd.setTime(date); cd.add(Calendar.DATE, 1);// 增加一天 放入集合 date = cd.getTime(); } return result; }
到了這里,關(guān)于重構(gòu)優(yōu)化第三方查詢接口返回大數(shù)據(jù)量的分頁問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!