# 问题描述
用户线上查询其上网流量详单数据加载慢,且有时候数据没有响应全~
1、经排除是调用第三方数据量达10w条响应会超时,数据没正常返回
2、现有线上缓存分页也是加载慢数据不能正常展示
3、第三方接口返回类似报文jsonj:
4、我们要返回页面的报文json:
5、页面最终类似截图显示结果:
# 解决方案:
> 第1种方案:历史遗留问题,第三方提供的接口是一次性返回数据,没考虑到用户查询一个月的数据量会超过几万条,所以我们作为调用方也只能通过redis缓存然后前端递归分页加载所有数据展现~
> 代码示例:
第1种方案若第三方接口返回的数据量少,线上一直正常呈现给用户数据;某天某个用户查询数据上万条返回然后问题暴露了,问题1、第三方接口超时失败(咱不通过协同系统解决问题);2、前端在递归查询缓存所有的数据加载慢用户体验非常差‘。
因为是线上问题,尽量避免前端修改最少化,只能通过后端接口来解决,通过原有业务流程及代码的解读,第三方接口最新版本也有兼容分页调用,但是没法同步分页的,其分页返回的数据达不到我们现有线上前端展示的结构要求,要按日期yyyy-MM-dd分开分组,只能重构优化;
第2种方案:
文章来源:https://www.toymoban.com/news/detail-709022.html
#相关工具类代码文章来源地址https://www.toymoban.com/news/detail-709022.html
/** * 时间数组中取最大最小日期 * * @param dateArray 时间日期数据: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(); }
/** * 日期转字符串 */ 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;// 定义结束日期 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; }
到了这里,关于重构优化第三方查询接口返回大数据量的分页问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!