昆山网站开发的公司,wordpress上一篇插件,通过百度指数不能判断出,云南软件开发公司排名# 问题描述 用户线上查询其上网流量详单数据加载慢#xff0c;且有时候数据没有响应全~ 1、经排除是调用第三方数据量达10w条响应会超时#xff0c;数据没正常返回 2、现有线上缓存分页也是加载慢数据不能正常展示 3、第三方接口返回类似报文jsonj#…# 问题描述 用户线上查询其上网流量详单数据加载慢且有时候数据没有响应全~ 1、经排除是调用第三方数据量达10w条响应会超时数据没正常返回 2、现有线上缓存分页也是加载慢数据不能正常展示 3、第三方接口返回类似报文jsonj 4、我们要返回页面的报文json
5、页面最终类似截图显示结果 # 解决方案 第1种方案历史遗留问题第三方提供的接口是一次性返回数据没考虑到用户查询一个月的数据量会超过几万条所以我们作为调用方也只能通过redis缓存然后前端递归分页加载所有数据展现~ 代码示例 第1种方案若第三方接口返回的数据量少线上一直正常呈现给用户数据某天某个用户查询数据上万条返回然后问题暴露了问题1、第三方接口超时失败咱不通过协同系统解决问题2、前端在递归查询缓存所有的数据加载慢用户体验非常差‘。 因为是线上问题尽量避免前端修改最少化只能通过后端接口来解决通过原有业务流程及代码的解读第三方接口最新版本也有兼容分页调用但是没法同步分页的其分页返回的数据达不到我们现有线上前端展示的结构要求要按日期yyyy-MM-dd分开分组只能重构优化 第2种方案 #相关工具类代码
/*** 时间数组中取最大最小日期** param dateArray 时间日期数据yyyy-MM-dd* param flag 值为true 返回最大值false返回最小值* return 2013-11-11*/
public static String showMaxOrMinDate(String[] dateArray, boolean flag) {MapString, 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);}}SetString keySet dateMap.keySet();String[] sorttedArray new String[keySet.size()];IteratorString 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 ListString 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();}ListString 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;
}