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


    # 问题描述
         用户线上查询其上网流量详单数据加载慢,且有时候数据没有响应全~
         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 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 keySet = dateMap.keySet();
        String[] sorttedArray = new String[keySet.size()];
        Iterator 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 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 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;
    }

  • 相关阅读:
    植物大战僵尸杂交版v2.1最新整合版,附PC端+安卓端+iOS端安装包+修改器+安装教程!
    自动删除大文件日志、过期日志
    Java集成阿里云的实时语音识别遇到的一些问题
    通过WordCount案例深入理解MapReduce的实现过程
    如何基于three.js(webgl)引擎架构,研发一套通过配置就能自动生成的3D机房系统
    【洛谷 P2392】kkksc03考前临时抱佛脚 题解(动态规划+01背包)
    【并发编程】Synchronized原理详解
    Android 安卓通过bindService ServiceConnection 没有响应的问题
    HDU3595 GG and MM
    【vue3】10.跟着官网学习vue3-表单输入绑定,双向绑定,封装input组件,封装ant-design-vue的input组件
  • 原文地址:https://blog.csdn.net/dengxw00/article/details/132866360