好久没有写博客了,最近一直在做性能优化,抽时间把工作中的一些心得写下来。
分页是程序中一个非常常见的功能,一般包含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