zoukankan      html  css  js  c++  java
  • 工作随笔——数据分页-性能优化

    好久没有写博客了,最近一直在做性能优化,抽时间把工作中的一些心得写下来。

    分页是程序中一个非常常见的功能,一般包含2部分的内容(数据列表和总数)。

    分享一下各种伪代码和思路(不包含业务搜索条件的优化和DB相关的优化)。

    // 1.完成需求的思路(伪代码)
    public Vo getList(String mis){
        // 查询总数
        long count = dao.count(mis);
        // 查询数据列表
        List<String> list = dao.queryList(mis);
        Vo vo = new Vo();
        vo.setCount(count);
        vo.setList(list);
        return vo;
    }
    // 2.稍微优化一下的思路(伪代码)
    public Vo getList(String mis){
        Vo vo = new Vo();
        // 查询总数
        long count = dao.count(mis);
        // 判断总数是否等于0,等于0就直接返回
        if(count == 0){
             vo.setCount(count);
             vo.setList(null);
             return vo;
        }
        // 查询数据列表
        List<String> list = dao.queryList(mis);
        vo.setCount(count);
        vo.setList(list);
        return vo;
    }
    // 3.缓存count字段的思路(伪代码)
    public Vo getList(String mis){
        Vo vo = new Vo();
        
        // 从缓存中查询总数,根据自己的场景调整key,一般使用自定义的功能key+查询条件组合成缓存key
    // 特别注意:查询条件中一定要移除时间戳这种会导致缓存命中失败的字段
    // 缓存需要设置自动过期时间,包括设置缓存的TTL,对比时间等等
    long count = cache.getCount("functionKey",mis); // 未命中缓存才查询数据库 if(count == -1){ count = dao.count(mis); cache.setCount("functionKey",mis,count); } // 判断总数是否等于0,等于0就直接返回 if(count == 0){ vo.setCount(count); vo.setList(null); return vo; } // 查询数据列表 List<String> list = dao.queryList(mis); vo.setCount(count); vo.setList(list); return vo; }
    // 4.上千万级以上数据的思路:
    //   1.将获取数据列表和总数拆分成2个接口提供
    //   2.前端缓存记录总数
    //   3.后端发送第N(N>1)页的记录总数
    // 请根据实际情况调整使用
    
    // 获取数据列表(伪代码)
    public Vo getList(String mis){
        Vo vo = new Vo();
        
        // 从缓存中查询总数,根据自己的场景调整key,一般使用自定义的功能key+查询条件组合成缓存key
        // 特别注意:查询条件中一定要移除时间戳这种会导致缓存命中失败的字段
        // 缓存需要设置自动过期时间,包括设置缓存的TTL,对比时间等等
        long count = cache.getCount("functionKey",mis);
        
        // 判断总数是否等于0,等于0就直接返回
        if(count == 0){
             vo.setCount(count);
             vo.setList(null);
             return vo;
        }
        
        // 查询数据列表
        List<String> list = dao.queryList(mis);
        vo.setCount(count);
        vo.setList(list);
        return vo;
    }
    // 获取count字段(伪代码)
    public Vo getCount(String mis){
        Vo vo = new Vo();
        
        // 从缓存中查询总数,根据自己的场景调整key,一般使用自定义的功能key+查询条件组合成缓存key
        // 特别注意:查询条件中一定要移除时间戳这种会导致缓存命中失败的字段
        // 缓存需要设置自动过期时间,包括设置缓存的TTL,对比时间等等
        long count = cache.getCount("functionKey",mis);
        
        // 未命中缓存才查询数据库
        if(count == -1){
            count = dao.count(mis);
            cache.setCount("functionKey",mis,count);
        }
        
        // 判断总数是否等于0,等于0就直接返回
        if(count == 0){
             vo.setCount(count);
             vo.setList(null);
             return vo;
        }
        
        // 查询数据列表
        vo.setCount(count);
        vo.setList(null);
        return vo;
    }

    以上,抛砖引玉。如有更好的思路,请留言。

    谢谢

    ,根据自己的场景调整key
  • 相关阅读:
    java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得
    linux修改系统时间和linux查看时区、修改时区的方法
    关于elasticsearch和kibana的时区和日期问题
    Jmeter中的几个重要测试指标释义
    jmeter之json数据参数化 断言等
    daemon
    linux之cp/scp命令+scp命令详解
    C语言中文件的读取和写入
    koa 项目实战(四)注册接口和调试工具(postman)
    koa 项目实战(三)创建测试接口和用户模型
  • 原文地址:https://www.cnblogs.com/zz0412/p/9333075.html
Copyright © 2011-2022 走看看