影响代码性能的点,仅供参考
1.防止N+1查询,循环里面套查询(外部查询接口)/查询多条数据循环请求补充其他数据(提供批量服务/并发执行解决)
2.数据库查询频繁的固定内容,增加缓存逻辑,防止并发下大量查询数据库操作
3.涉及到数据库更新操作,避免在查询业务涉及更新操作(增加可读性),库的更新和查询尽量区分开
4.定义传参对象/传递对象,对象中字段有互斥关系的,尽量拆分两个对象定义,增加可读性
事例:
1.N+1影响性能,单个循环查询消耗时间会翻倍,影响性能
public List
if(CollectionUtils.isEmpty(actIds)){
return null;
}
List
//1.actId查询活动信息,请求actService
ActInfo actInfo = actService.getActInfo(a);
//2.校验活动中风控信息,请求riskService
return actInfo;
}).collect(Collectors.toList());
return list;
}
2.并发频繁请求固定数据到数据库
public Result
//查询缓存
CacheActDTO cacheActDTO = getActFromCache(actId);
//查询数据库
if (null == cacheActDTO || null == cacheActDTO.getId()) {
//防止大量并发查询操作
synchronized (actId) {
cacheActDTO = getActFromCache(actId);
if (null != cacheActDTO && null != cacheActDTO.getId()) {
return Result.of(cacheActDTO);
}
cacheActDTO = cocoonActService.getActFromDB(actId);
//入缓存
if (!setActIntoCache(cacheActDTO)) {
LogUtil.error("[getActById]-failed to set activity info into cache. actId={}.", actId);
}
}
}
return Result.of(cacheActDTO);
}
private boolean setActIntoCache(CacheActDTO actDTO) {
if (null == actDTO || null == actDTO.getId()) {
return true;
}
boolean setResult = true;
ActRedisCacheKey actRedisCacheKey = RedisCacheKey.actCacheKey();
String activityCacheKey = actRedisCacheKey.getActivityCacheKey(actDTO.getId());
try {
redisClient.setEx(activityCacheKey, JSON.toJSONString(actDTO), Time);
} catch (Exception e) {
setResult = false;
}
return setResult;
}
private CacheActDTO getActFromCache(Long actId) {
String activityCacheKey = RedisCacheKey.actCacheKey().getActivityCacheKey(actId);
try {
String cacheStr = redisClient.get(activityCacheKey);
return com.jd.fastjson.JSON.parseObject(cacheStr, CacheActDTO.class);
} catch (Exception e) {
}
return null;
}
3.查询中避免有更新操作