1.无限极数据获取
private List<CourseType> treeDataRecursion(long pid){
List<CourseType> courseTypeList = courseTypeMapper.selectList(new QueryWrapper<CourseType>().eq("pid", pid));
if (courseTypeList == null || courseTypeList.size() < 1) {
return null;
}
for (CourseType courseType : courseTypeList) {
List<CourseType> courseTypes = treeDataRecursion(courseType.getPid());
courseType.setChildren(courseTypes);
}
return courseTypeList;
}
private List<CourseType> treeDataLoop(long pid){
List<CourseType> allNodes = courseTypeMapper.selectList(null);
Map<Long,CourseType> allNodeDto = new HashMap<>();
for (CourseType courseType : allNodes) {
allNodeDto.put(courseType.getId(), courseType);
}
List<CourseType> result = new ArrayList<>();
for (CourseType courseType : allNodes) {
if (courseType.getPid() == 0) {
result.add(courseType);
}else {
Long pidTmp = courseType.getPid();
// 提前建立id和node直接关系,直接获取 时间复杂度2n
CourseType parent = allNodeDto.get(pidTmp);
parent.getChildren().add(courseType);
}
}
return result;
}
2.缓存优化
对于经常查询但很少修改的数据我们应该做缓存
集群环境下,我们应该使用中央缓存 Redis
- 主从复制---单点故障
- 哨兵模式---每个节点数据一样,处理不了海量数据
- redis-cluster---解决单点故障,高并发,大量数据
缓存穿透
高并发访问缓存和数据库中不存在的数据,击穿缓存,每次都要进入数据库查询
解决方案:
1.使用布隆过滤器,将可能出现的数据装在一个足够大的bitmap中,肯定不会出现的数据过滤掉(布谷鸟过滤器也可以)
2.如果查询的数据为空,也设置到缓存中,过期时间设置短一点(不超过5分钟)
缓存击穿
高并发访问一个过期的key,直接导致高并发访问数据库
解决方案:
1.让热点数据永不过期
2.加入互斥锁
缓存雪崩
大量的key同时过期,高并发访问数据库到宕机
解决方案:设置过期时间不一致,热点数据永不过期