直接上代码
// 在for外查询 list
List<QueAttr> byIds = queAttrService.findByIds(Lists.newArrayList(attrIds));
Map<Long, String> attrId_name = byIds.stream().filter(Objects::nonNull)
.collect(Collectors.toMap(QueAttr::getAttrId, QueAttr::getName));
for (QueAttrPath queAttrPath : queAttrPaths) {
List<Long> pathIds = queAttrPath.getPathIds();
List<Map<String, String>> names = Lists.newArrayList();
for (Long pathId : pathIds) {
String name = attrId_name.get(pathId);// attrId
// String name = queAttrService.getCacheAttr(pathId).getString("name"); for内查询 即使查询redis查询也比for外的耗时长
if (StringUtils.isNotBlank(name)) {
Map<String, String> _temp = Maps.newHashMap();
_temp.put("attrId", pathId.toString());
_temp.put("name", name);
names.add(_temp);
}
}
queAttrPath.setName(names);
}
总结:
1.for内的循环查库尽量避免
2.循环操作单次redis命令时间= n次网络往返+ n次命令执行,所以也是比较耗时的,可以根据业务场景考虑使用pipeline执行N条命令,来减少网络时间