重构优化第三方查询接口返回大数据量的分页问题

# 问题描述

用户线上查询其上网流量详单数据加载慢,且有时候数据没有响应全~

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) {
    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;
}
相关推荐
没有bug.的程序员15 小时前
CI/CD 流水线的物理级崩塌:Spring Boot 镜像从 1.2G 暴降至 200M 的 Docker 底层大重构
java·spring boot·ci/cd·docker·重构
智算菩萨15 小时前
AI原生6G网络:语义通信、可重构智能表面与边缘智能的深度融合研究
网络·论文阅读·人工智能·ai·重构·论文笔记·ai-native
百胜软件@百胜软件15 小时前
社区生鲜零售革命:8万亿赛道的效率突围与生态重构
人工智能·重构·零售
weixin_5498083617 小时前
从“人海战术“到“智能寻猎“:eRoad AI招聘系统的实战价值重构
人工智能·重构
Vanranrr17 小时前
全局搜索、跳转、重构快捷键的实战组合
重构·键盘·敏捷开发·快捷键
EasyDSS17 小时前
企业级私有化视频会议平台EasyDSS点播+直播+会议三位一体,重构企业数字化生态
重构
GOWIN革文品牌咨询17 小时前
AI入口下的B2B品牌升级:从内容堆积到标准答案位的重构方法
人工智能·重构·智能设备·工业软件·b2b品牌策划·b2b品牌设计
lpfasd12317 小时前
2026年第12周GitHub趋势周报:Claude生态爆发,AI工程化加速,开发者工具链重构
人工智能·重构·github
Fzuim20 小时前
从 LLM 接口到 Agent 接口:AI 融合系统的架构演进与未来趋势分析报告
人工智能·ai·重构·架构·agent·runtime
Reisentyan2 天前
[Refactor]CPP Learn Data Day 1
c++·重构