工作随笔——数据分页-性能优化

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

分页是程序中一个非常常见的功能,一般包含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
原文地址:https://www.cnblogs.com/zz0412/p/9333075.html